#include<stdio.h>
void Swap(int *x, int *y) {
int t;
t = *x;
*x = *y;
*y = t;
}
int Partition(int A[], int p, int r) {
int X = A[p]; /* 选取第一个数为主元 主元不动 */
int j = p; /* j从p开始 */
for (int i = p + 1; i <= r; i++) /* 从p+1开始遍历 */
if (A[i] <= X) {
j++; /* 找到A[i]≤X时,j往后移动一位 */
Swap(&A[i], &A[j]); /* 将比X小的数移到前面 */
}
/*
* 此时j指向的位置和j的左边的数必定小于X,此时将存放X的A[p]与A[j]换位置
* 此时A[j]的左边的数都小于等于A[j],右边的书都大于A[j],然后返回A[j]的位置
*/
Swap(&A[j], &A[p]);
return j;
}
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 main(void) {
int a[10] = {5, 4, 3, 2, 100, 9, 8, 7, 6, 10};
QuickSort(a, 0, 9);
for (int i = 0; i < 10; i++)
printf("%d\t", a[i]);
return 0;
}