【資料結構】希爾排序(ShellSort)
阿新 • • 發佈:2018-11-16
- 概念:
希爾排序法,又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數, 把待排序檔案中所有資料分成幾個組,所有距離為gap的資料分在同一組內,並對每一組內的資料進行排序。 然後,去重複上述分組和排序的工作。當到達gap=1時,所有資料在一組內排好序。
- 演算法思想:
將待排序陣列按照步長gap進行分組,然後對每組的元素利用直接插入排序的方法進行排序;每次將gap折半減小,迴圈上述操作;當gap=1時,利用直接插入,完成排序。
- 具體程式碼:
#include <stdio.h> #include <stdlib.h> void ShellSort(int* a, int n)//希爾排序 { int gap = n; while (gap > 1) { gap = gap / 3 + 1; for (int i = 0; i < n - gap; i++) { int end = i; int tmp = a[end + gap]; while (end >= 0 && a[end]>tmp) { a[end + gap] = a[end]; end -= gap; } a[end + gap] = tmp; } } } void SortTest() { int a[10] = { 5, 2, 4, 6, 1, 3, 8, 7, 9,0 }; int sz = sizeof(a) / sizeof(a[0]); printf("希爾排序:>"); ShellSort(a, sz); PrintArray(a, sz); } int main() { SortTest(); system("pause"); return 0; }
- 特性總結:
1.希爾排序是對直接插入排序的優化;
2.當gap> 1時都是預排序,目的是讓陣列更接近於有序。當gap== 1時,陣列已經接近有序的了,這樣就
會很快。這樣整體而言,可以達到優化的效果。我們實現後可以進行效能測試的對比;
3.希爾排序的時間複雜度不好計算,需要進行推導,推匯出來平均時間複雜度: O(N^1.3- -N^2)
4.穩定性:不穩定
5.敏感性:對資料很敏感,如果陣列已經接近有序,排序效率很高