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

C語言快速排序算法代碼逐行深度分析:分區邏輯與遞歸結構

     編輯:C 語言入門

標準快速排序實現

void sort(int a[], int size) {
    int i = 0, j = size - 1;
    int pivot = a[0];                 // 基準值

    if (size > 1) {
        while (i < j) {
            // 從右向左找首個 < pivot
            for (; i < j; j--) {
                if (a[j] < pivot) {
                    a[i] = a[j];      // 填左坑
                    break;
                }
            }
            // 從左向右找首個 > pivot
            for (; i < j; i++) {
                if (a[i] > pivot) {
                    a[j] = a[i];      // 填右坑
                    break;
                }
            }
        }
        a[i] = pivot;                 // 基準歸位
        sort(a, i);                   // 遞歸左半
        sort(&a[i+1], size - i - 1);  // 遞歸右半
    }
}

「挖坑填坑」分區過程圖解

初始陣列:[6, 9, 7, 3, 4],pivot=6,i=0, j=4

步驟動作陣列狀態坑位i/j
1右掃描找 4<6[4, 9, 7, 3, 4]索引 0i=0, j=4
2左掃描找 9>6[4, 9, 7, 3, 4]索引 1i=1, j=4
3右掃描找 3<6[4, 3, 7, 3, 4]索引 1i=1, j=3
4左掃描找 7>6[4, 3, 7, 3, 4]索引 2i=2, j=3
5i==j=2 循環結束[4, 3, 6, 3, 4]基準歸位i=j=2

最終:[4, 3, 6, 7, 9],基準 6 歸位,左側 ≤ 6,右側 ≥ 6。

關鍵細節解析

  1. 基準值保存:pivot = a[0],原位置成為第一個坑。
  2. 交替掃描:先右後左,每次填坑產生新坑,無需額外交換變量。
  3. 終止條件:i == j 時坑位即基準最終位置。
  4. 遞歸邊界:size <= 1 直接返回。
  5. 指針算術**:&a[i+1] 傳遞右半區首地址,size - i - 1 為右半長度。

常見變體與優化

複雜度與穩定性

  • 平均:O(n log n)
  • 最壞:O(n²)(已有序 + 固定首元素基準)
  • 空間:O(log n) 遞歸棧
  • 穩定性:不穩定(相等元素可能交換相對序)

調試建議

在分區循環中打印 i, j, a[i], a[j],觀察坑位移動軌跡,是理解快排的最佳方式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
優化點做法效果
基準選擇三數取中 / 隨機避免有序陣列退化 O(n²)
小區間切換size < 10 用插入排序減少遞歸開銷
尾遞歸消除迴圈處理較大分區棧深度 O(log n) → O(1)
三路分區Dijkstra 荷蘭國旗大量重複鍵值加速