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结束。
结果: