快速排序 (Quick Sort)

分治策略的高效排序算法

算法原理

快速排序采用分治策略:

  1. 选择基准:选择一个元素作为基准(通常选最后一个)
  2. 分区:将比基准小的放到左边,大的放到右边
  3. 递归:对左右子数组递归排序

时间复杂度:平均 $$ O(n \log n) $$,最坏 $$ O(n^2) $$

空间复杂度:$$ O(\log n) $$(递归栈)

算法特点

  • 原地排序:不需要额外空间(少量空间用于递归)
  • 不稳定排序:相同元素的相对顺序可能改变
  • 实际应用最优:常数因子小,通常快于归并排序
点击"开始排序"观看演示
基准 (Pivot)
-
左边区
-
右边区
-

int partition(int a[], int l, int r) {
    int pivot = a[r];  // 选择最后一个元素作为基准
    int i = l - 1;     // i 指向小于等于基准的最后一个元素

    for (int j = l; j < r; j++) {
        if (a[j] <= pivot) {
            i++;
            swap(a[i], a[j]);  // 小元素移到左边
        }
    }
    swap(a[i + 1], a[r]);  // 基准放到正确位置
    return i + 1;
}

void quickSort(int a[], int l, int r) {
    if (l < r) {
        int p = partition(a, l, r);  // 分区
        quickSort(a, l, p - 1);      // 递归排序左半部分
        quickSort(a, p + 1, r);      // 递归排序右半部分
    }
}
                

优化技巧

  • 随机化基准:避免最坏情况(已排序数组)
  • 三数取中:取首、中、尾的中位数作为基准
  • 小数组插入排序:当子数组较小时改用插入排序