常见的排序算法----希尔排序(插入排序类,JavaScript实现)

思想
直接插入排序在某些时候效率是很高的,比如在
(1)数组本来就有序的时候,或者基本有序的时候,或者
(2)本来的元素很少
这样只需要进行很少的插入操作,效率就会变高了
但是这两个条件非常苛刻,那虽然条件可能本身不存在,但是可以人为创造条件
让元素变得基本有序,最后再执行直接插入排序是希尔排序的根本思想

做法是:
将原数组按照一定距离进行分组,并将各个分组进行插入排序,最后就可以变得基本有序,如有数组:[9,1,5,8,3,7,4,6,2],现在按照增量为4进行分组,则可分成:[9,3,2],[1,7],[5,4],[8,6],分别对这些组进行排序,有[2,3,9],[1,7],[4,5],[6,8],
最后回到原本的位置:[2,1,4,6,3,7,5,8,9],这样就会发现大的在后面,小的在前面,基本有序,这个时候只需要进行直接插入排序即可。

理解思路的视频
https://www.bilibili.com/video/av38482441


// 其实在进行分组排序时,只需要把他们看成是直接插入排序的增大版即可,即位置跨度较大
// 利用increment增量来进行跨度是多少,最后为1时就是普通的插入排序
// 增量序列的选择目前还是个数学难题,可根据适合的数进行选择
function shellSort(arr) { 
    var temp;
    var increment;
    var sortList = [3, 1];  //开始的时候进行跨度为3的分组,最后1表示直接插入排序
    for(var k = 0; k <sortList.length; k++) {
        increment = sortList[k];
        for(var i = increment; i < arr.length; i++) {
            if(arr[i] < arr[i-increment]) {
                temp = arr[i];
                for(var j = i; j-increment >= 0 && arr[j-increment] > temp; j -= increment) {
                    arr[j] = arr[j-increment];
                }
                arr[j] = temp;
            }
        }
    }
}; 

复杂度分析
常见的排序算法----希尔排序(插入排序类,JavaScript实现)