/*
* A[p...r] 被划分为两部分,A[p...q] 和 A[q+1...r],
* A[p...q] 的每个元素都小于等于 A[q+1...r] 中的元素。
* 对子数组递归调用划分方法,整个数组就有序了。
* */
void quick_sort(int A[], int p, int r)
{
int q;
if (p<r)
q = partition(A, p, r);
quick_sort(A, p, q);
quick_sort(A, q+1, r);
}
void exchange(int *a, int *b)
{
int t = *a; *a = *b; *b = t;
}
int partition(int A[], int p, int r)
{
int x = A[p];
int i = p-1;
int j = r+1;
while (1) {
do j--; while (A[j]<=x);
do i++; while (A[i]>=x);
if (i<j)
exchange(A+i, A+j);
else
return j;
}
return p;
}
/*
* 随机返回一个[l, h]之间的数。
* */
int random(int l, int h)
{
return l + rand()%(h-l+1);
}
int randomized_partition(int A[], int p, int r)
{
int i = random(p, r);
exchange(A+p, A+i);
return partition(A, p, r);
}