js希尔排序

**希尔排序**
对数组按照某一特定增量进行直接插入排序,逐渐减少增量,当增量为1时,进行最后一次直接插入排序,最终得到结果。
以下方数据为例,这里会讲解希尔排序的具体步骤。

    function dd(arr_){
                let flag = Math.floor(arr_.length/2);//增量
                while(flag>=1){//判断增量小于1时,排序结束
                    for(let i = 0;i<flag;i++){//判断起始位置
                        for(let k = i;k<arr_.length;k=k+flag){//获取每组数据然后进行直接插入排序
                            let t = arr_[k];//存储当前位置
                            for(let j = k+flag;j<arr_.length;j=j+flag){
                                if(arr_[j]<t){//判断比较大小
                                    arr_[k] = arr_[j];
                                    arr_[j] = t;
                                    t = arr_[k];
                                }
                            }
                        }
                    }
                    console.log([...arr_]);//第一轮:[3,5,1,6,0,8,9,4,7,2]第二轮:[0,2,1,4,3,5,7,6,9,8],第三轮:[0,1,2,3,4,5,6,7,8,9]
                    flag = Math.floor(flag/2);
                }
            }
            dd([8,9,1,7,2,3,5,4,6,0]);

具体步骤:

初始数据为arr = [8,9,1,7,2,3,5,4,6,0];初始增量设置为数组长度的一半,即flag = arr.length/2 = 5;每次增量减少一半,知道小于1结束。

以5为增量:  第一步 下标为0 {8,3}
      第二步 下标为1 {9,5}
      第三步 下标为2 {1,4}
        第四步 下标为3 {7,6}
        第五步 下标为4 {2,0}
       总共得到 五组{8,3} {9,5} {1,4} {7,6} {2,0}
       对每一组进行直接插入排序,得到{3,8} {5,9} {1,4} {6,7} {0,2}
     最终结果为 [3,5,1,6,0,8,9,4,7,2]
以2位增量:  第一步 下标为0 {3,1,0,9,7}
      第二步 下标为1 {5,6,8,4,2}
                     总共得到 两组{3,1,0,9,7},{5,6,8,4,2}
                    对每一组进行直接插入排序,得到{0,1,3,7,9},{2,4,5,6,8}
                   最终结果为 [0,2,1,4,3,5,7,6,9,8]
以1为增量: 第一步{0,2,1,4,3,5,7,6,9,8}
                    进行直接插入排序[0,1,2,3,4,5,6,7,8,9]
                    下次增量为0结束。

结果:

 

posted @ 2022-08-16 18:16  奔跑的哈密瓜  阅读(97)  评论(0编辑  收藏  举报