void quicksort(int a[], int p, int r) { int q; if (p < r) { q = partition(a, p, r); quicksort(a, p, q-1); quicksort(a, q+1, r); } } int partition(int a[], int p, int r) { int i, j, x; x = a[r]; i = p - 1; for (j = p; j < r; j++) { if (a[j] <= x){ i++; swap(&a[j], &a[i]); } } swap(&a[r], &a[++i]); return i; } void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
测试用例
#include <stdio.h> int main() { int a[] = {5, 1, 7, 12, 9, 6}; quicksort(a, 0, 5); for (i = 0; i < 6; i++) { printf("%d%s", a[i], (i==5)?"\n":" "); } return 0; }
附:另一种partition方法(更加常见)
int partition(int a[], int low, int high)
{
int pivot = a[low];
while (low < high) {
while (low < high && a[high] >= pivot) high--;
a[low] = a[high];
while (low < high && a[low] <= pivot) low++;
a[high] = a[low];
}
a[low] = pivot;
return low;
}