设当前要排序数组中元素的下标为 p 到 r ,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。
#include<stdio.h> int a[1000]; voidquick_sort( int left, int right) { if (left >= right) return; int key = a[left], i = left, j = right, temp; //以最左边的元素为基准 while (i < j) { while (a[j] >= key && i < j) --j; while (a[i] <= key && i < j) ++i; if (i != j) { //两边交换法 temp = a[i]; a[i] = a[j]; a[j] = temp; } } a[left] = a[i]; a[i] = key; quick_sort(left, i - 1); quick_sort( i + 1, right); } intmain() { int n; scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &a[i]); quick_sort( 0, n - 1); for (int i = 0; i < n; ++i) printf("%d ", a[i]); return0; }