跳转至

快速排序

代码

void quick(int *a, int l, int r) {  // Sort a[l...r].
    if (l >= r) return;
    int i = l + 1, j = r;
    while (1) {  //
        while (!(a[l] < a[i] || i == r)) i++;
        while (!(a[l] >= a[j] || j == l)) j--;
        if (i < j) {
            int tmp = a[i];
            a[i] = a[j], a[j] = tmp;
        } else
            break;
    }
    int tmp = a[l];
    a[l] = a[j], a[j] = tmp;
    quick(a, l, j - 1);
    quick(a, j + 1, r);
}

算法

分治法,先序递归。

将序列中的元素按首元大小分边,再对两边分别递归处理。

时间复杂度 O(n\log{n})

实现

上述“分边”操作 出自唐发根老师的《数据结构》教材,用两个指针从序列两夹逼将整个序列按相对第一个元素的大小分类。