int hoare_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)
swap(A, i, j);
else
return j;
}
}
void hoare_quick_sort(int A[], int p, int r)
{
if (p < r) {
int q = hoare_partition(A, p, r);
hoare_quick_sort(A, p, q);
hoare_quick_sort(A, q + 1, r);
}
}
2. 普通快排
int partition(int A[], int p, int r) { int x = A[r]; int i = p - 1; int j; for (j = p; j <= r - 1; j++) { if (A[j] <= x) { i++; swap(A, i, j); } } swap(A, i + 1, r); return i + 1; } void quick_sort(int A[], int p, int r) { if (p < r) { int q = partition(A, p, r); quick_sort(A, p, q - 1); quick_sort(A, q + 1, r); } }
3. 随机快排
int randomized_partition(int A[], int p, int r)
{
int i = p + rand() % (r - p + 1);
swap(A, i, r);
return partition(A, p, r);
}
void randomized_quick_sort(int A[], int p, int r)
{
if (p < r) {
int q = randomized_partition(A, p, r);
randomized_quick_sort(A, p, q - 1);
randomized_quick_sort(A, q + 1, r);
}
}
4. 三数取中快排
int median_partition(int A[], int p, int r) { int range = r - p + 1; int med1 = p + rand() % range; int med2 = p + rand() % range; int med3 = p + rand() % range; int med = (A[med1] < A[med2]) ? (A[med2] < A[med3] ? med2 : (A[med1] < A[med3] ? med3 : med1)): (A[med1] < A[med3] ? med1 : (A[med2] < A[med3] ? med2 : med3)); swap(A, med, r); return partition(A, p, r); } void median_quick_sort(int A[], int p, int r) { if (p < r) { int q = median_partition(A, p, r); median_quick_sort(A, p, q - 1); median_quick_sort(A, q + 1, p); } } //测试方法 int main(void) { int A[SIZE] = { 2, 8, 7, 1, 3, 5, 6, 4 }; print(A, SIZE); //hoare_quick_sort(A, 0, SIZE - 1); //quick_sort(A, 0, SIZE - 1); //randomized_quick_sort(A, 0, SIZE - 1); median_quick_sort(A, 0, SIZE - 1); print(A, SIZE); return 1; }