• 数据结构与算法之排序: 侏儒排序 (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++下去(这不是我们研究的范围)
    • 衡量算法复杂度我们只研究最坏的情况
    • 无论成功或是失败,这个算法的目光只盯住当前相邻的两个元素,不断的一点点儿的努力,总有一天会到头的
  • 相关阅读:
    基于JAVAWeb的学生宿舍公寓后台管理系统
    下一代实时数据库:Apache Doris 【四】扩容缩容
    对极几何与三角化求3D空间坐标
    最优控制问题中的折扣因子
    Docker高级-1.复杂安装示例(mysql主从复制、redis集群)
    java基础 native关键字
    itertools:Python3迭代库(持续更新ing...)
    jquery广告图片切换效果
    引擎入门 | Unity UI简介–第1部分(10)
    (Matlab)基于蝙蝠算法实现电力系统经济调度
  • 原文地址:https://blog.csdn.net/Tyro_java/article/details/134053461