quicksort:分治思想。
分解:数组A[p, r)被划分成两个子数组A[p..q) 和 A[q+1, r),使得A[p..q)中的每个元素小于等于A[q], A[q]也小于A[q+1..r)中的每个元素。q是划分过程要返回的结果。
解决:递归调用quicksort,对子数组A[p..q) 和 A[q+1, r)进行排序。
合并:因为子数组都是原址排序的,所以不需要合并操作:A[p..r)已经有序。
代码数组下标从0开始,并且所有函数使用左闭右开区间。与算法导论第三版书上的伪代码不同的部分在注释标出。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <ctime>
#include <cstdlib>
inline void swap(int &a, int &b)
{ int t = a; a = b; b = t; }
int partition(int *a, int p, int r) { //对 a[p, r) 原址重排
int x = a[r-1]; //a[r] ==> a[r-1]
int i = p - 1;
for (int j = p; j < r - 1; ++j)
if (a[j] <= x) {
++i;
swap(a[i], a[j]);
}
swap(a[i+1], a[r-1]);
return i + 1;
}
void quicksort(int *a, int p, int r) { //调用q