#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
//p,r为边界,先处理左边再处理右边
void QuickSort(int a[],int p,int r)
{
if(p<r)
{
int q = Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
void Swap(int a[],int left,int right)
{
int tmp;
tmp = a[left];
a[left] = a[right];
a[right] = tmp;
}
int Partition(int a[],int p,int r)
{
int i=p,j=r+1;
//本代码的主元选择的是p到r范围内的最左边的即p下标的数
int x = a[p];
while(1)
{
//将i和j一个从左,一个从右开始相向而行,使得在相遇之前,i部分都是小于x的数,j部分都是大于x的数。左右找到不匹配的数就互换值。
while(a[++i]<x && i<r) ;
while(a[--j]>x) ;
if(i>=j) break;
Swap(a,i,j);
}
//最后把p和j的下标互换一下就可以保证p到r范围内的数,a[j]左边都是小于a[j],右边都是大于a[j],但不代表左边有序或者右边有序,只是单纯的比a[j]小或大在一边而已
a[p]=a[j];
a[j]=x;
return j;
}
int main()
{
int a[] = {7,1,5,6,3,8,2,10,9,4};
int i;
QuickSort(a,0,MAXSIZE-1);
for(i=0;i<MAXSIZE;i++)
{
printf("%5d",a[i]);
}
return 0;
}