希爾排序(C)

2022-06-13 10:12:12 字數 1009 閱讀 4681

希爾排序

希爾排序是一種直接插入排序的改進版,插入排序每次移動一位,移動效率較低,而希爾排序將陣列分割成 n 份,每次移動 n 位, 因此相比插入排序要高效。當移動位數n等於1時,等同於直接插入排序(鏈結)。

演算法描述

假設:對於集合 n【len】進行希爾排序,將 n 分割成 n 份,進行一次插入排序,通常 n 初始值取 len / 2,之後每次取 n /= 2,直到 n = 1時,進行最後一次插入排序,排序結束。

第一輪分割排序:用陣列distance【i】臨時儲存分割間距,即:n = len,distance[0] = n / 2,對元素n【k】,進行一輪插入排序

即:k = distance[0]; k < len; k += distance[0];

第 i 輪分割排序:此時分割間距為 distance[i],繼續進行一輪插入排序

即:k = distance[i]; k < len; k += distance[i];當分割間距 distance[i] 為 1 時,進行最後一次插入排序。

示例**

下面用c編寫希爾排序如下:

void

shell_sort

(int

*n,int len)

int i, dist, temp, j;

for(k =

0; distance[k]

>=

1; k++

) n[j + dist]

= temp;}}

}free

(distance)

; distance =

null

;}

執行結果

輸入序列 n[10] = ,將整個希爾排序過程列印如下:

演算法複雜度

C 希爾排序

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

C 希爾排序

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

希爾排序 C

先將待排序記錄序列分割成若干個 較稀疏的 子串行,分別進行直接插入排序。經過上述粗略調整,整個序列中的記錄已經基本有序,最後再對全部記錄進一次直接插人排序。首先選定記錄間的距離為d1 i 1 在整個待排序記錄序列中將所有間隔為d1的記錄分成 組,進行組內直接插入排序。然後取i i 1,記錄間的距離為...