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

Visual C# 常用排序演算法(四):快速排序原理、分區過程與遞迴實作

     編輯:關於C語言

基本思想

分治法:選取基準值,將陣列分為左右兩區 (左 ≤ 基準 ≤ 右),遞迴處理子區。

分區過程示範

初始:[49, 38, 65, 97, 76, 13, 27, 49]

單趟分區交換步驟:

第1次交換: [27, 38, 65, 97, 76, 13, 49, 49]
第2次交換: [27, 38, 49, 97, 76, 13, 65, 49]
第3次交換: [27, 38, 13, 97, 76, 49, 65, 49]
第4次交換: [27, 38, 13, 49, 76, 97, 65, 49]

分區結果:[27, 38, 13] 49 [76, 97, 65, 49]

遞迴處理子區,最終有序:13, 27, 38, 49, 49, 65, 76, 97

C# 遞迴實作

private static void QuickSort(ref double[] array, int left, int right)
{
    int pivot = left;
    bool scanRight = true, scanLeft = true;
    
    while (scanRight || scanLeft)
    {
        scanRight = false; scanLeft = false;
        
        // 從右向左掃描:找小於基準的元素
        for (int i = right; i > pivot; i--)
        {
            if (array[i] < array[pivot])
            {
                ExchangeValue(ref array[i], ref array[pivot]);
                pivot = i;
                scanRight = true;
                break;
            }
        }
        
        // 從左向右掃描:找大於基準的元素
        for (int i = left; i < pivot; i++)
        {
            if (array[i] > array[pivot])
            {
                ExchangeValue(ref array[i], ref array[pivot]);
                pivot = i;
                scanLeft = true;
                break;
            }
        }
    }
    
    // 遞迴處理左右子區
    if (right - left > 0)
    {
        if (pivot != left)  QuickSort(ref array, left, pivot - 1);
        if (pivot != right) QuickSort(ref array, pivot + 1, right);
    }
}

private static void ExchangeValue(ref double a, ref double b)
{
    double t = a; a = b; b = t;
}

效能特性

指標複雜度
平均時間O(n log n)
最差時間O(n²) (已有序陣列)
空間O(log n) 遞迴堆疊
穩定性不穩定

優化建議

  • 基準值選取:三數取中、隨機基準、中位數近似
  • 小陣列改用插入排序 (閾值約 10-20)
  • 尾遞迴優化或改用迭代 + 顯式堆疊
  • .NET 內建 Array.Sort 採用內省排序,已處理上述優化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved