1. 程式人生 > >圖解算法系列之希爾排序

圖解算法系列之希爾排序

希爾排序

(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) 之間。