希爾排序法基本思想

2021-04-22 10:16:49 字數 2255 閱讀 4092

希爾排序(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個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一...