希爾排序 C

2021-10-10 12:46:16 字數 588 閱讀 4364

先將待排序記錄序列分割成若干個「較稀疏的」子串行,分別進行直接插入排序。經過上述粗略調整,整個序列中的記錄已經基本有序,最後再對全部記錄進一次直接插人排序。

①首先選定記錄間的距離為d1(i=1),在整個待排序記錄序列中將所有間隔為d1的記錄分成—組,進行組內直接插入排序。

②然後取i=i+1,記錄間的距離為di(di

typedef long long ll;

using namespace std;

void

shellinsert

(ll a[

], ll n, ll d)

}void

shellsort

(ll a[

], ll n)

int main()

1.增量取法

關於增量d的取法,最初希爾(shell)提出取d=[n/2],再取d=[d/2],直到d=1為止。該思路的缺點是,奇數字置的元素在最後一步才會與偶數字置的元素進行比較,使得希爾排序效率降低。因此後來 knuth提出d=[d/3]+1。此外還有其他多種取法,但均沒有給出最優性證明。

2.時間複雜度:o(n^1.5)

3.演算法穩定性:不穩定

C 希爾排序

基本思想 將整個待排序記錄 分割成若干個子串行,在子串行內分別進行直接插入排序,待整個序列中的記錄 基本有序 時,對全體記錄進行直接插入排序。子串行不是 被簡單的 逐段分割 而是將 相距某個 增量 的記錄組成乙個子串行,希爾排序開始時增量較大,每個子串行中的記錄個數較少,從而排序速度較快 當增量較小...

C 希爾排序

1 首先,從陣列的首元素開始每隔 步長 間隔 個元素就挑選乙個元素出來作為子陣列元素。2 然後每個子陣列各自進行比較,比較好後,每個子陣列都有順序,進入下一輪,步長 間隔 減少,再根據步長 間隔 分組進行比較。3 重複以上操作,最後就有順序了。include include using namesp...

希爾排序(C)

希爾排序 希爾排序是一種直接插入排序的改進版,插入排序每次移動一位,移動效率較低,而希爾排序將陣列分割成 n 份,每次移動 n 位,因此相比插入排序要高效。當移動位數n等於1時,等同於直接插入排序 鏈結 演算法描述 假設 對於集合 n len 進行希爾排序,將 n 分割成 n 份,進行一次插入排序,...