/* * 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); }