圖解算法系列之希爾排序
阿新 • • 發佈:2018-12-12
希爾排序
(1)演算法描述
對於給定的線性序列,將這個序列按照一定規則進行分組,每個小序列使用插入排序的方法排序。由於是每個分組進行排序,序列總體只是區域性有序,全域性還是無序的。因此全部的分組進行一次排序後,再將小分組劃分成更大的分組進行排序,直到只有一個分組,並且這個分組也是有序的。也就是說上面描述的分組是個增量分組。隨著增量的減少,每個分組的元素逐漸變多。當增量減少至1的時候,整個線性序列就有序了。
理解增量分組
(2)圖解演算法
(3) C/C++程式碼實現
Custom.h
void ShellSort(int arr[], int number);
Custom.cpp
void ShellSort(int arr[], int number) { // 每次進行分組操作, 增量gap逐漸變為1的時候分組逐漸擴大 for(int gap = number/2; gap > 0; gap /= 2) { // 此時gap表示陣列中有多少個元素,因此需要遍歷gap遍 for(int i = gap; i < number; i++) { // i-gap表示分出來的小陣列的下標,arr[]中的i+gap表示下標的移動步長 for(int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j = j - gap) { int temp = arr[j]; arr[j] = arr[j + gap]; arr[j + gap] = temp; } } } }
(4)Java程式碼實現
public class ShellSort { public static void sort(int[] arr, int number) { for (int gap = number/2; gap > 0; gap /= 2) { for (int i = gap; i < number; i++) { for(int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j = j - gap) { int temp = arr[j]; arr[j] = arr[j + gap]; arr[j + gap] = temp; } } } } }
(5) 時間複雜度分析
由程式碼可知,希爾排序時間複雜度肯定會大於O(n),但是也肯定不會超過O(n^2), 實際上希爾排序的時間複雜度介於O(n^1.3) 到 O(n^2) 之間。