如果了解希尔排序之前,了解一下插入排序那么对理解希尔排序是非常有好处的,希尔排序的要点是在排序的时候对所排序列分组,在比较两个元素大小的时候,比较的是两个距离为组距的两个位置的元素,整个过程中组距会递减,直到最后组距为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,也就是间隔的取法有很多种研究,而且希尔排序的时间复杂度分析也是一个比较高深的数学问题,在此我就不打算去深入了解了。