快排的疑惑?

以前一直不理解快排是什么东西,那天忘记看了一个什么突然感觉明白了快排是什么东东。然后以升序排列为例写了一个程序。然后按照下面的思路写了一段代码。

快排就是找一个数作为基数,与其比较比起比起小的放在左边,比其大的放其右边,递归其左右,一般情况下是选第一个数作为基数。


void Swap(int *x,int *y){
//交换两个数
	 int a = *x;
	 int b = *y;
	 a+=b;
	 (b=a-b);
	 (a-=b);
	 *x = a;
	 *y = b;
	 return ;
}
void qs(int *input,int begin ,int end){
	//对区间[begin,end)的数进行排序
	if(begin >= end) return;
	
	int flag = begin;
	for(int i = begin + 1; i <end;++i){
		if(input[flag] >input[i]){
			Swap(&input[flag + 1],&input[i]);
			Swap(&input[flag + 1],&input[flag]);
			++flag;
		}	
	}
	qs(input,begin,flag);
	qs(input,flag+1,end); 		 
}



看思路其实是分治算法,复杂度应该在,nlgn,但是挡序列为降序或者已经为排列好的序列的时候这个复杂度就为n^2了。但是当数据随机排列的时候,最好的情况也就是NlgN,不明白为什么这个算法有什么好处呢?于是之百度查书,发现快排算法不是上面那个思路,而是这样说的:



一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j -- ),找到第一个小于key的值A[j],A[i]与A[j]交换;
4)从i开始向后搜索,即由前开始向后搜索(i ++ ),找到第一个大于key的A[i],A[i]与A[j]交换;
5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。)


看上去其思路是每一趟的快排都是要走一边所有的数据,对比了一下上面的已经排好序的情况也是,感觉和我的那个思路差不多,算法思路最坏的情况也是N^2,而分治的情况就是NlgN为什么不直接用分治算法呢?也请大家指点一下我的那个思路那里有问题。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值