快速排序

感觉快排的原理就像种萝卜,一个萝卜一个坑。

例如有一群人,每个人都有一个号码并且按号码站好了:

第一个人站出来说了:“比我高的站右边,比我低的站左边。“,这就把筛选条件找了出来,而且第一个人在最后所处的位置也找到了,然后从高号码开始筛选,如果比他高,位置不变,轮到低一位的人,如果遇到比他低的人,结束从高号码到低号码的循环,然后从低号码到高号码开始检查,(以上都必须保持低号码小于高号码),然后递归继续检查。

说可能不好理解,举例说明吧:

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值