希爾插入排序法 C語言

2021-10-02 18:49:32 字數 3205 閱讀 5791

排序原理:

希 爾( shell) 排序 演算法 先 將要 排序 的 一組 數 按 某個 增量 d 分成 若干 組, 每組 中 記錄 的 下標 相差 d 對 每組 中 全部 元素 進行 排序, 然後 用 乙個 較小 的 增量 對 它 進行 再次 分組, 並對 每個 新 組 重新 進行 排序。 當 增量 減到 1 時, 整個 要 排序 的 數 被 分成 一組, 排序 完成。 因此 希 爾 排序 實質上 是一 種 分組 插入 方法。

當 陣列 初始 狀態 基本 有 序時, 直接 插入排序 所需 的 比較 和 移動 次數 均 較少。 當 n 值 較小 時, n 和 n2 的 差別 也 較小, 即 直接 插入 排序 的 最好 時間 複雜度 o( n) 和 最壞 時間 複雜度 0( n2) 差別 不大。 在 希 爾 排序 開始時, 增量 較大, 分組 較多, 每組 的 記錄 數目 少, 故 各組 內 直接 插入 較快, 後來 增量 d 逐漸 縮小, 分組 數 逐漸 減少, 而 各組 的 記錄 數目 逐漸 增多。 但 由於 已經 按 d- 1 作為 距離 排 過 序, 陣列 較 接近 於 有序 狀態, 所以 新的 一 趟 排序 過程 也 較快。

另外, 由於 分組 的 存在, 相等 的 元素 可能 會 分在 不 同組, 導致 它們 的 次序 可能發生 變化, 因此 希 爾 排序 是 不穩 定的。

草稿筆記

**實現

**實現需要十分注意的一點,是判斷的時候需要 j >= 0; 而不是 j >0; 否則對第0個元素就沒有排序了

#include #include #define success		0

#define param_err -1

int shellsort(int * array, int size)

int i = 0, j =0; /*插入排序使用*/

int m = 0, n = 0; /*按dist分組使用*/

int insert = 0;

int dist = 0; /*希爾步距*/

#ifdef debug

int k = 0; /*debug 輸出*/

#endif

for(dist = size/2; dist > 0; dist--) else

}/*插入到合適的位置*/

array[j + dist] = insert;

}#ifdef debug

printf("\n ------ another group -----------\n");

printf("[");

for(k =m; k < size; k = k + dist)

printf("]\n");

printf("\n");

#endif

} }

return success; }

int main(int argc, char ** ar**);

int i = 0;

printf("before sort: \n");

for(i = 0; i < 10; i++)

printf("\n");

shellsort(array, 10);

printf("after sort: \n");

for(i = 0; i < 10; i++)

printf("\n");

return 0;

}

編譯

gcc shellsort.c -ddebug

除錯輸出

before sort:

7 3 5 8 0 9 1 2 4 6

*****=== distance = 5 **********===

------ another group -----------

[ 7 9 ]

------ another group -----------

[ 1 3 ]

------ another group -----------

[ 2 5 ]

------ another group -----------

[ 4 8 ]

------ another group -----------

[ 0 6 ]

*****=== distance = 4 **********===

------ another group -----------

[ 0 7 8 ]

------ another group -----------

[ 1 6 9 ]

------ another group -----------

[ 2 3 ]

------ another group -----------

[ 4 5 ]

*****=== distance = 3 **********===

------ another group -----------

[ 0 3 4 9 ]

------ another group -----------

[ 1 5 7 ]

------ another group -----------

[ 2 6 8 ]

*****=== distance = 2 **********===

------ another group -----------

[ 0 2 4 5 8 ]

------ another group -----------

[ 1 3 6 7 9 ]

*****=== distance = 1 **********===

------ another group -----------

[ 0 1 2 3 4 5 6 7 8 9 ]

after sort:

0 1 2 3 4 5 6 7 8 9

插入排序 C語言 希爾排序 縮小增量法

希爾排序是希爾 donald shell 於1959年提出的一種排序演算法。希爾排序也是一種 插入排序 它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為 縮小增量排序 適合於資料量中等大小的排序 成千上萬的資料量 同時該演算法是衝破o n 2 的第一批演算法之一。基本思想 分割成若干個較小的子...

插入排序和希爾排序(C語言)

下屬專案 測試用例數量 插入排序無1 希爾排序無1 插入排序的關鍵在於 當前元素 比如第1個元素是當前元素 前面的序列 比如第0個元素構成的序列 都是有序的,再把當前元素 第1個元素 插入到這個有序序列 第0個元素構成的序列 中,於是形成多了乙個元素的有序序列 即第0個 第1個元素構成的有序序列 i...

希爾排序 與插入排序 C語言

希爾排序 shell sort 是插入排序的一種。是針對直接插入排序演算法的改進。該方法又稱縮小增量排序,希爾排序基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序 然後,取第二個增量d2shellso...