感觉快排的原理就像种萝卜,一个萝卜一个坑。
例如有一群人,每个人都有一个号码并且按号码站好了:
第一个人站出来说了:“比我高的站右边,比我低的站左边。“,这就把筛选条件找了出来,而且第一个人在最后所处的位置也找到了,然后从高号码开始筛选,如果比他高,位置不变,轮到低一位的人,如果遇到比他低的人,结束从高号码到低号码的循环,然后从低号码到高号码开始检查,(以上都必须保持低号码小于高号码),然后递归继续检查。
说可能不好理解,举例说明吧:
2 2 4 9 3 6 7 15 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移
2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置
2 14 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面
2 14 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变
经过第一轮的快速排序,元素变为下面的样子
[1] 2 [4 9 3 6 7 5]
之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。
代码:
#include<stdio.h>
void qsort(int a[],int low,int high)
{
if(low<high)
{
int right=high;//记录起点和终点
int left=low;
int r=a[low];
while(low<high)
{
while(low<high&&a[high]>=r)//从高到低
high--;
a[low]=a[high];
while(low<high&&a[low]<r)//从低到高
low++;
a[high]=a[low];
}
a[low]=r;//确定了基准的位置
qsort(a,left,low-1);//以基准为分界线,把两边的分别快排
qsort(a,low+1,right);
}
}
int main()
{
int n,i;
int a[100000];
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
qsort(a,1,n);
for(i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
return 0;
}