首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現希爾排序:分組插入排序的高效改進

     編輯:Java 相關知識

希爾排序:從插入排序到亞線性級效能的躍升

希爾排序(Shell Sort)通過預設間隔分組插入排序,將元素大步長移動至大致位置,再縮小間隔逐步有序。本文提供標準 Java 實現與間隙序列選擇建議。

算法核心思想

  1. 選擇間隙序列 h(如 n/2, n/4, ..., 1)
  2. 按間隙分組,對每組執行插入排序
  3. 縮小間隙重複,直到 h=1 完成最終插入排序

標準實現

public static void shellSort(int[] arr) {
    int n = arr.length;
    for (int gap = n / 2; gap > 0; gap /= 2) {        // 間隙序列:n/2, n/4, ...
        for (int i = gap; i < n; i++) {                // 插入排序起始位置
            int temp = arr[i];
            int j = i;
            while (j >= gap && arr[j - gap] > temp) {  // 組內插入排序
                arr[j] = arr[j - gap];
                j -= gap;
            }
            arr[j] = temp;
        }
    }
}

間隙序列選擇影響效能

效能特徵

  • 時間複雜度:取決於間隙序列,最優 O(n log² n),最差 O(n²)
  • 空間複雜度:O(1) 原地排序
  • 穩定性:不穩定(長距離交換破壞相對順序)
  • 適用場景:中等規模數據(萬級)、嵌入式環境(無遞歸棧、代碼極短)

對比基準

同等數據量下:希爾排序 ≫ 直接插入/選擇/冒泡,但 ≪ 快排/歸併/堆排。Java 內置 Arrays.sort()(雙軸快排+TimSort)生產環境首選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
序列公式平均時間複雜度備註
Shell 原版n/2^kO(n²)最差情況退化
Hibbard2^k - 1O(n^1.5)較好
Sedgewick4^k + 3·2^(k-1) + 1O(n^1.33)實踐推薦
Knuth(3^k - 1)/2O(n^1.5)教材常用