Java希爾排序

Jacks丶發表於2020-10-06

希爾排序圖示

希爾排序示例

  • 希爾排序提高直接插入排序的效率,在直接插入排序的基礎上使用增量進行分組,增量為 gap,每次分組會減小增量,直至增量減小為 1 ,所以又稱縮小增量排序。
  • array[gap] 開始依次往後遍歷獲取待插入值 insertValue
  • gap 處開始向前遍歷獲取待插入位置 insertIndex,每次向前移動 gap 個位置
    • insertValue < array[insertIndex - gap] 時,將 insertIndex 向前移動 gap 個位置繼續比較
    • insertValue >= array[insertIndex - gap] 時,說明找到插入位置,將 insertValue 插入到 array[insertIndex] 處即可

參考程式碼

public static void shellSort(int[] arr) {
    // gap 為間隔分組,gap 每一輪遞減 2 倍
    for (int gap = arr.length / 2; gap > 0; gap /= 2) {
        // 從第 gap 個元素開始向後遍歷獲取待插入值
        for (int i = gap; i < arr.length; i++) {
            int insertValue = arr[i];  // 初始化待插入值
            int insertIndex = i;  // 初始化待插入位置
            // 在不越界的前提下,尋找待插入位置
            while (insertIndex - gap >= 0 && insertValue < arr[insertIndex - gap]) {
                arr[insertIndex] = arr[insertIndex - gap];  // 將前 gap 個位置的值後移 gap
                insertIndex -= gap;  // 將 insertIndex 前移 gap 個位置
            }
            arr[insertIndex] = insertValue;
        }
    }
}

排序效果測試

public static void main(String[] args) {
    //int[] arr = {2, 6, 9, 5, 4, 7, 8, 3, 1};
    System.out.println("排序前:" + Arrays.toString(arr));
    shellSort(arr);
    System.out.println("希爾排序:" + Arrays.toString(arr));
}

1


100萬隨機資料測試排序時間

public static void main(String[] args) {
    int[] arrTime = new int[1000000];
    for (int i = 0; i < 1000000; i++) {
        arrTime[i] = (int) (Math.random() * 1000000);
    }
    long former = System.currentTimeMillis();
    shellSort(arrTime);
    long later = System.currentTimeMillis();
    System.out.println("時間:" + (later - former) + " 毫秒");
}

2

相關文章