《算法导论》第3版7.1提出了快速排序的描述
与归并排序一样,快速排序也使用了分治思想。下面是对一个典型的子数组A[p..r]进行快速排序的三步分治过程:
分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一个元素
都小于等于A[q],而A[q]也小于等于A[q+1..r]中的每个元素。其中,计算下标q也是划分过程的一部分。
解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]进行排序。
合并:因为子数组都是原址排序的,所以不需要合并操作:数组A[p..r]已经有序。
为了排序一个数组A的全部元素,初始调用是quicksort
算法的关键部分是partition过程,它实现了对子数组A[p..r]的原址重排。
代码如下
int partition(int A[], int p, int r)
{
int x = A[r];
int i = p - 1;
for (int j = p; j < r; ++j)
{
if (A[j] <= x)
{
++i;
swap(A[i], A[j]);
}
}
swap(A[i + 1], A[r]);
return i + 1;
}
void quicksort(int A[], int p, int r)
{
if (p < r)
{
int q = partition(A, p, r);
quicksort(A, p, q - 1);
quicksort(A, q + 1, r);
}
}