希尔排序
如果了解希尔排序之前,了解一下插入排序那么对理解希尔排序是非常有好处的,希尔排序的要点是在排序的时候对所排序列分组,在比较两个元素大小的时候,比较的是两个距离为组距的两个位置的元素,整个过程中组距会递减,直到最后组距为1时,对整个序列执行一次插入排序。
希尔排序之所以快的原因是:一次希尔排序可以消灭更多个逆序对(相比冒泡排序),而在基本有序之后,也就是组距为1的时候,希尔排序实际上执行的是插入排序,而插入排序在序列基本有序的情况下是性能很出色的算法。
function shell(arr){
let len = arr.length, gap = Math.floor(len/2),
i, j, tmp;
while(gap > 0){
for(i = gap; i < len; i++){
tmp = arr[i];
for( j = i - gap;j >= 0 && tmp < arr[j]; j = j - gap){
arr[j+gap] = arr[j];
}
arr[j + gap] = tmp;
}
gap = Math.floor(gap/2);
}
return arr;
}事实上关于希尔排序的gap,也就是间隔的取法有很多种研究,而且希尔排序的时间复杂度分析也是一个比较高深的数学问题,在此我就不打算去深入了解了。

浙公网安备 33010602011771号