希爾排序(shell sort)又稱為「縮小增量排序」。是2023年由d.l.shell提出來的。該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。
具體做法:首先確定一組增量d0,d1,d2,d3,...,dt-1()其中n>d0>d1>...>dt-1=1),對於i=0,1,2,...,t-1,依次進行下面的各趟處理:根據當前增量di將n個元素分成di個組,每組中元素的下標相隔為di;再對各組中元素進行直接插入排序.
2、下面給出希爾排序演算法的執行過程。
(1)採用希爾排序法排序的各趟的結果如下:
初始:503,17,512,908,170,897,275,653,426,154,509,612,677,765,703,94
第1趟:426,17,509,612,170,765,275,94,503,154,512,908,677,897,703,653
第2趟(d2=4):170,17,275,94,426,154,509,612,503,765,512,653,677,897,703,908
第3趟(d3=2):170,17,275,94,426,154,503,612,509,653,512,765,677,897,703,908
第4趟(d1=1):17,94,154,170,275,426,503,509,512,612,653,677,703,765,897,908
(2)例如,n=8,陣列a的八個元素分別為:17,3,30,25,14,17,20,9。
給定例項的shell排序的排序過程
假設待排序檔案有10個記錄,其關鍵字分別是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次為:
5,3,1
排序過程如【
動畫模擬演示
】。shell排序的演算法實現
1. 不設監視哨的演算法描述
using system;
using system.collections.generic;
using system.text;
namespace exshellsorter
arr[j - 1] = t;}}
} static void main(string args)
;shellsorter s = new shellsorter();
s.sort(array);
foreach (int m in array)
console.writeline("", m); }
}}注意:當增量d=1時,shellpass和insertsort基本一致,只是由於沒有哨兵而在內迴圈中增加了乙個迴圈判定條件"j>0",以防下標越界。
2.設監視哨的shell排序演算法
具體演算法【參考書目[12] 】
演算法分析
1.增量序列的選擇
shell排序的執行時間依賴於增量序列。
好的增量序列的共同特徵:
① 最後乙個增量必須為1;
② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。
有人通過大量的實驗,給出了目前較好的結果:當n較大時,比較和移動的次數約在n
l.25到1.6n
1.25之間。
2.shell排序的時間效能優於直接插入排序
希爾排序的時間效能優於直接插入排序的原因:
①當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。
②當n值較小時,n和n
2的差別也較小,即直接插入排序的最好時間複雜度o(n)和最壞時間複雜度0(n
2)差別不大。
③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量d
i逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按d
i-1作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。
因此,希爾排序在效率上較直接插人排序有較大的改進。
3.穩定性
希爾排序是不穩定的。參見上述例項,該例中兩個相同關鍵字49在排序前後的相對次序發生了變化。
發表於
希爾排序基本思想
基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插人排序 然後,取第二個增量d2 1重複上述的分組和排序,直至所取的增量dt 1 dt t l 2 1 即所有記錄放在同一組中進行直接插入排序為止。該方法實質上...
回溯法基本思想
回溯法又稱試探法。回溯法的基本做法是深度優先搜尋,是一種組織得井井有條的 能避免不必要重複搜尋的窮舉式搜尋演算法。回溯演算法的基本思想是 從一條路往前走,能進則進,不能進則退回來,換一條路再試。當我們遇到某一類問題時,它的問題可以分解,但是又不能得出明確的動態規劃或是遞迴解法,此時可以考慮用回溯法解...
氣泡排序基本思想
原理 比較兩個相鄰的元素,將值大的元素交換至右端。每次獲得 最大 的數 思路 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟 首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一...