#include<stdio.h>
//从小到大,快速排列
int a[1000001],n;//全局变量,在子函数中都要用到
void asort(int left,int right)//排列范围的左右界限
{
int i,j,t,tmp;
tmp=a[left];//选取左端作为基准数
i=left;
j=right;
if(left>right)
return;//左右相反,直接返回
while(i!=j)//一趟结束后ij要碰头 当未碰头时
{
//先从右往左找,找到一个比tmp小的数为止
while(a[j]>=tmp&&i<j)//这里要大于等于,才能找到小的数
j--;
//再从左往右找一个比tmp大的数
while(a[i]<=tmp&&i<j)
i++;
//交换两元素在数组中位置
if(i<j)//i,j没有相遇时
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//此时i=j a[i]左面的数都比tmp小,右面的数都比tmp大
//将基准数(最左段数)归位到数组中去,与a[i]互换位置
a[left]=a[i];
a[i]=tmp;
asort(left,i-1);//继续处理左边的,因为左面的比tmp小,但左面本身还是无序的,这里是一个递归的过程
asort(i+1,right);//继续处理右边的,这里是一个递归的过程
}
int main()
{
int i,j,t;
//读入数据
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
asort(1,n); //快速排序调用
//输出排序后的结果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
// getchar();getchar();
return 0;
}
奆佬能看下为什么只过了两个点吗..谢谢!