常見的排序算法----希爾排序(插入排序類,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;
            }
        }
    }
};

複雜度分析
在這裏插入圖片描述