基本概念:
希爾排序按其設計者希爾(donald shell)的名字命名,它是一種基於插入排序的快速排序演算法,要了解希爾排序,必須先掌握插入排序的原理與實現。
希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好的了(此時插入排序較快)。
步長的選擇是希爾排序的重要部分。只要最終步長為1任何步長序列都可以工作(且步長要小於陣列長度)。演算法最開始以一定的步長進行排序。然後會繼續以一定步長進行排序,最終演算法以步長為1進行排序。當步長為1時,演算法變為插入排序,這就保證了資料一定會被排序。
關於希爾排序的時間複雜度,與步長息息相關:
過程如圖:
簡單例子分析:
待排序陣列:
第一次步長h=4,
那麼陣列按照步長可以拆分成4個小陣列([0]6的意思是下標[0]的值為6)
對這4個小陣列分別進行插入排序後,4個小陣列變成:
合併起來就是:
第二次步長h=1,
那麼陣列按照步長只有1個陣列了
對這個陣列進行一次插入排序後,最終順序就成為:
原始碼:
#include void shell_sort(int arr, int size)
}/* 每輪內迴圈後輸出陣列的現狀 */
int k;
printf("the step=%d : ", h);
for (k = 0; k < size; ++k)
printf("\n");
/* 計算下一輪步長 */
h = h / 3;
}}int main()
; int size = sizeof(arr) / sizeof(int);
//sort
shell_sort(arr, size);
//print
int i = 0;
for (i; i < size; ++i)
return 0;
}
編譯執行:
原文出自:
end;
希爾排序詳解
基本概念 希爾排序按其設計者希爾 donald shell 的名字命名,它是一種基於插入排序的快速排序演算法,要了解希爾排序,必須先掌握插入排序的原理與實現。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步...
希爾排序演算法(排序詳解)
希爾排序 shell sort 是插入排序 的一種。也稱縮小增量 我們分割待排序記錄的目的是減少待排序記錄的個數,並使整個序列向基本有序發展。而如上面這樣分完組後,就各自排序的方法達不到我們的要求。因此,我們需要採取跳躍分割的策略 將相距某個 增量 的記錄組成乙個子串行,這樣才能保證在子串行內分別進...
排序演算法 詳解希爾排序演算法
希爾排序實際上是一種插入排序的優化,希爾排序的目的是先進行預排序,使陣列更加的有序,將需要排序的陣列分成n gap個大小為gap的子陣列,對子樹組進行插入排序。當gap等於1時,就相當於直接插入排序了。例如 9 8 7 6 5 4 3 2 1 排公升序 直接插入排序需要 45次 用希爾排序 時間複雜...