快速排序

10 分钟

快排的思路是“定个标杆,先分堆”:随手挑一个数当基准,把比它小的都甩到左边、比它大的都甩到右边,这样这个基准就落到了它最终该在的位置。然后对左右两堆分别再快排。像整理书架,先挑一本当界,矮的往左、高的往右,两边再各自整理。

#include <iostream>
using namespace std;
void qsort(int a[], int l, int r) {
    if (l >= r) return;
    int pivot = a[l], i = l, j = r;
    while (i < j) {
        while (i < j && a[j] >= pivot) j--;
        a[i] = a[j];
        while (i < j && a[i] <= pivot) i++;
        a[j] = a[i];
    }
    a[i] = pivot;
    qsort(a, l, i - 1); qsort(a, i + 1, r);
}
int main() {
    int a[] = {3,1,4,1,5,9,2};
    qsort(a, 0, 6);
    for (int x : a) cout << x << " "; // 1 1 2 3 4 5 9
    return 0;
}

要注意别越界:递归两边时用 i-1 和 i+1,基准所在的那一格已经归位,不用再排。边界写错很容易死循环或漏排。

小纸条

快排和归并的主要区别是什么?

登录 后可看答案

快速排序 · C++ 入门 · op599 课程