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

希爾排序:插入排序的間距優化實戰

     編輯:關於C語言

希爾排序核心思想

希爾排序是直接插入排序的重大改進版本。直接插入排序每次只能將元素移動一位,當小數值位於陣列末尾時需大量移動操作。希爾排序引入增量序列概念,先按固定間距分組進行插入排序,使元素能「大步跨越」快速接近最終位置,隨著增量逐漸縮小至 1,最終退化為標準插入排序完成精細調整。

演算法流程

  1. 選取初始增量 increment = n / 2(n 為陣列長度)。
  2. 將陣列按增量分為 increment 個子序列,各子序列內部進行直接插入排序。
  3. 增量縮半 increment /= 2,重複步驟 2。
  4. 當增量為 1 時執行最後一次插入排序,排序完成。

常見增量序列:Shell 原始序列 (n/2, n/4, ..., 1)、Hibbard 序列 (2^k-1)、Sedgewick 序列等,不同序列影響效能上限。

C 語言完整實現代碼

#include <stdio.h>
#include <stdlib.h>

void ShellSort(int arr[], int n) {
    int increment = n / 2;
    while (increment > 0) {
        for (int i = increment; i < n; i++) {
            int temp = arr[i];
            int j;
            for (j = i - increment; j >= 0 && arr[j] > temp; j -= increment)
                arr[j + increment] = arr[j];
            arr[j + increment] = temp;
        }
        increment /= 2;
    }
}

void print(int arr[], int n) {
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\n");
}

int main() {
    int arr[] = {9, 1, 5, 8, 3, 7, 4, 6, 2};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("排序前:\n"); print(arr, n);
    ShellSort(arr, n);
    printf("排序後:\n"); print(arr, n);
    return 0;
}

效能特性分析

指標數值/特性
時間複雜度依增量序列而異:O(n²) ~ O(n1.3) ~ O(n log²n)
空間複雜度O(1)
穩定性不穩定(相同元素可能因跨組移動改變相對順序)
適用場景中等規模資料(n < 5000),嵌入式系統、系統級排序庫備選

與直接插入排序對比

  • 比較次數:希爾排序大幅減少,特別是逆序或近似逆序資料。
  • 移動次數:同樣顯著減少,元素以增量為步長跳躍移動。
  • 代碼複雜度:僅在插入排序外層包裹增量迴圈,實現簡單。

總結

希爾排序是「分組插入排序」的經典實踐,以 O(1) 空間換取接近 O(n log n) 的時間效能,是介於簡單排序與進階排序(快排、堆排、歸併)之間的實用過渡演算法,值得掌握其增量序列選擇與實現細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved