思想:找到一个基数a,将小于a的数放在a的左边,大于a的数放在a的右边,然后继续分别对a左边的数和a右边的数做相同的操作。知道排序结束。
代码如下:
#include<stdio.h>
int a[1005];
int qsort(int left,int right)
{
if(left>right)
return 0;
int temp=a[left];//指定基数
int i=left,j=right;
while(i!=j)//当哨兵相遇时则停止
{
//此时是从小到大排序,将下面两个while循环中的>=变<=,<=变>=后即是从大到小排序
while(a[j]>=temp&&i<j)//每次必须让右边的哨兵先移动
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j)//将a[i]与a[j]交换,也可以将判断条件写成a[i]>a[j]
{
int b=a[i];a[i]=a[j];a[j]=b;
}
}
a[left]=a[i]; a[i]=temp;//当哨兵相遇后交换两哨兵对应的值
qsort(left,i-1);//继续将基数左边的数进行此操作
qsort(i+1,right);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(0,n-1);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
}