算法精解----快速排序2

前面排序方法有个很明显的bug就是递归次数很多,而且递归进去的时候什么也不干。这样非常浪费CPU资源,所以呢,现在说说另外一种快速排序的方法,这种方法和前面的不同,前面的方法是K值分别和大于它的值和小于它的值进行交换,这样也就是说,如果发生交换操作,那么只能够是一个大于的值或者一个小于的值。但是现在的方法就是如果发生交换,那么将会是大于值和小于值同时进行交换,就是两两交换。代码如下:

void fastSort2(int *p, int start, int end)
{
	if ((start == end) || (end -1 < 0))
		return;
	int i = start;
	int j = end -1 ;
	int k = p[end];	//K
	int temp = 0;

	while (i < j)
	{
		while (i < j && p[i] <= k)
		{
			i++;
		}

		while (i<j && p[j] >= k)
		{
			j--;
		}
		//条件满足
		temp = p[i];
		p[i] = p[j];
		p[j] = temp;
	}


	//交换中间的值
	if (k < p[j])
	{
		temp = p[j];
		p[j] = k;
		p[end] = temp;
	}
	

	fastSort2(p, start, ((j - 1) > start) ? (j - 1) : start);
	fastSort2(p, ((j + 1) < end) ? (j + 1) : end  , end );

}


如下:下面就是中间的大小值交换步骤,也就是这里的交换操作是不需要K值进行干涩的,只是需要K值参与判断操作。

比如下面数列,当前K值是5,现在i和j分别是0,3

6 1 4 2 5

那么6将会和2进行交换。

	while (i < j)
	{
		while (i < j && p[i] <= k)
		{
			i++;
		}

		while (i<j && p[j] >= k)
		{
			j--;
		}
		//条件满足
		temp = p[i];
		p[i] = p[j];
		p[j] = temp;
	}

当我们把中间的值交换的差不多了,也就是达到我们循环退出条件的时候

while (i < j)

我们就推出去,需要进行交换K值判断,如下:

	//交换中间的值
	if (k < p[j])
	{
		temp = p[j];
		p[j] = k;
		p[end] = temp;
	}
	


这里有个条件就是k值小于p[j]的时候,我们就需要进行判断,当然k大于p[j]的时候,我们就没有那个必要进行交换了。如果交换了,后期将会出现问题。

下面我们看看调试动画:



好了,大概就是上面说的那样。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值