• 数据结构与算法之排序: 侏儒排序 (Typescript版)


    排序

    • 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)

    侏儒排序

    • 该排序属于 贪心 策略
    • 关注的是局部,是一种苟且的东西

    算法实现

    1 )普通版

    // version 1
    function gnomeSort() {
        const len: number = this.length;
        for(let i: number = 1; i < len;) {
            // 短路保护 贪心比较当前两个
            if(i < 1 || this[i-1] <= this[i]) {
                ++ i; // 正确,则递增,这里有个性能的问题,当一轮比较结束,还需要自增移动到之前已经比较好的位置,重复性太大
            } else {
                // 逆序,则交换
                [this[i-1], this[i]] = [this[i], this[i-1]]
                -- i; // i回退进行比较,直到当前所有都有序
            }
        }
    }
    
    const arr: number[] = [5,4,3,2,1];
    arr.gnomeSort();
    console.log(arr); // [1, 2, 3, 4, 5]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2 )优化版

    // version 2 改进了不需要重复比较已经有序的元素了, 也就是说不需要自己再往回走了
    function gnomeSort() {
        const len: number = this.length;
        // k是当前比较的位置, 从1 ~ len-1
        for(let k: number = 1; k < len; ++ k) {
            // 通过i进行内部比较排序, 逆序,则交换
            for(let i: number = k; i > 0 && this[i-1] > this[i]; --i) {
                [this[i-1], this[i]] = [this[i], this[i-1]]
            }
        }
    }
    
    const arr: number[] = [5,4,3,2,1];
    arr.gnomeSort();
    console.log(arr); // [1, 2, 3, 4, 5]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 侏儒排序(Gnome sort 或 Stupid sort) 其时间复杂度为:O(n^2)
    • 优点是简单明了,一眼就能看出来是干什么(顺序往前走,逆序往回走并进行交换达到当前变成顺序)
    • 每向前移动一个位置(这里记当前位置为k),就要求将当前位置的所有序排好(重点!!!)
    • 缺点是:比较苟且, 只针对眼前,当排好一次序之后,还要重新比较才能回到之前k的位置, 浪费了时间
    • 最坏的情况是输入序列完全逆序, 要将当前所有元素都比较一遍,最好的情况是已经有序了, 会一直i++下去(这不是我们研究的范围)
    • 衡量算法复杂度我们只研究最坏的情况
    • 无论成功或是失败,这个算法的目光只盯住当前相邻的两个元素,不断的一点点儿的努力,总有一天会到头的
  • 相关阅读:
    刷题时常用的函数(持续补充ing)
    第二课第一周第8节 风险得分计算+作业解析
    自动控制原理2.2---控制系统的复数域数学模型
    【操作系统&C语言】作业调度算法 先来先服务&短作业优先
    举例解释大数定律、中心极限定理及其在机器学习中的应用
    typescript中的类型type与接口interface
    MySQL热点行更新
    信息系统项目管理师第四版学习笔记——组织通用管理
    在印度与软件相关的发明可不可以申请专利?
    vue虚拟dom和diff算法
  • 原文地址:https://blog.csdn.net/Tyro_java/article/details/134053461