思想:找到一个基数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");
}
}
本文详细介绍了一种高效的排序算法——快速排序。通过设定基数并不断分区的方式实现数组元素的排序,文章给出了具体的C语言实现代码,并解释了如何通过递归调用达到完全排序的目的。
1001

被折叠的 条评论
为什么被折叠?



