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

資料結構:C語言快速排序兩大經典版本(雙向掃描與單向掃描)

     編輯:關於C語言

版本一:教科書雙向掃描(Hoare 分區)

void QuickSort(int left, int right) {
    if (left >= right) return;
    int pivot = a[left];
    int i = left, j = right;
    while (i != j) {
        while (a[j] >= pivot && i < j) j--;
        while (a[i] <= pivot && i < j) i++;
        if (i < j) { int t=a[i]; a[i]=a[j]; a[j]=t; }
    }
    a[left] = a[i]; a[i] = pivot;
    QuickSort(left, i-1);
    QuickSort(i+1, right);
}

特點:雙指針向中間收斂,基準值最終歸位 i。

版本二:單向掃描(Lomuto 分區)

void quickSort2(int x[], int l, int r) {
    if (l >= r) return;
    int m = l;
    for (int i = l+1; i <= r; i++)
        if (x[i] < x[l]) { m++; int t=x[m]; x[m]=x[i]; x[i]=t; }
    int t = x[l]; x[l] = x[m]; x[m] = t;
    quickSort2(x, l, m-1);
    quickSort2(x, m+1, r);
}

void swap2(int &a, int &b) {   // C++ 參考,C 用指標
    if (&a == &b) return;
    a ^= b; b ^= a; a ^= b;
}

特點:單指針 m 維護「小於基準區」邊界,代碼更簡潔。

比較

維度雙向掃描單向掃描
交換次數較少較多
代碼長度較長極短
基準值選取固定 left固定 left
最壞情況有序陣列 O(n²)有序陣列 O(n²)

進階優化

  1. 隨機化基準值 / 三數取中。
  2. 小區間改用插入排序。
  3. 尾遞迴消除 / 非遞迴棧實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved