插入排序---希尔插入排序算法(Javascript版)
取一個小于n的整數作為第一個增量,把序列分組。所有距離為增量的倍數的元素放在同一個組中。先在各組內進行直接插入排序;然后,取第二個增量(第二個<第一個)重復上述的分組和排序,直至所取的增量=1,即所有元素放在同一組中進行直接插入排序為止。
?
一般的初次取序列的一半為增量,以后每次減半,直到增量為1。
?
以下代碼在nodejs中執行通過。
function shellInsertSort(elements, di){//從增量的所在位置開始for(var i = di; i < elements.length; i++){//升序if(elements[i] < elements[i-di]){//取出增量位置的元素作為被插入元素(哨兵)var guard = elements[i];var j = i - di;elements[i] = elements[j];//向前,將增量的倍數的位置作為同一組比較及進行直接插入法while(j >= 0 && guard < elements[j]){elements[j+di] = elements[j];j -= di;}//插入elements[j + di] = guard;}} }function shellSort(elements){//增量為序列的一半var di = parseInt(elements.length / 2);while(di >= 1){shellInsertSort(elements, di);//每次減半,最后增量必須為1di = parseInt(di / 2);} }var elements = [10, 9, 8, 7, 6, 5]; console.log('before: ' + elements); shellSort(elements); console.log(' after: ' + elements);?
效率:比直接插入法快。但不是一種穩定的排序算法,關鍵取決于增量的選擇,初次通常選取序列長度的一半。
(轉帖):希爾排序時間復雜度的下界是n*log2n。希爾排序沒有快速排序算法快 O(n(logn)),因此中等大小規模表現良好,對規模非常大的數據排序不是最優選擇。但是比O(n^2)復雜度的算法快得多。并且希爾排序非常容易實現,算法代碼短而簡單。 此外,希爾算法在最壞的情況下和平均情況下執行效率相差不是很多,與此同時快速排序在最壞的情況下執行的效率會非常差。專家們提倡,幾乎任何排序工作在開始時都可以用希爾排序,若在實際使用中證明它不夠快,再改成快速排序這樣更高級的排序算法. 本質上講,希爾排序算法是直接插入排序算法的一種改進,減少了其復制的次數,速度要快很多。 原因是,當n值很大時數據項每一趟排序需要的個數很少,但數據項的距離很長。當n值減小時每一趟需要和動的數據增多,此時已經接近于它們排序后的最終位置。 正是這兩種情況的結合才使希爾排序效率比插入排序高很多。
在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,后來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由于已經按di-1作為距離排過序,使文件較接近于有序狀態,所以新的一趟排序過程也較快。
?
總結
以上是生活随笔為你收集整理的插入排序---希尔插入排序算法(Javascript版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 岳阳楼记
- 下一篇: Javascript中call函数和ap