快排递归改为非递归

首先我们在复习一下快排的递归写法,这里所用的方法为前后指针法:

代码如下:

void QuickSort(int*a ,int begin,int end)
{
   int prev=begin;
   int key=begin;
   int cur=begin+1;
   while(a[prev]<a[key] && ++prev!=cur)
   {
       Swap(&a[cur],&a[prev]);
   }  
   cur++;
   key=prev;
   QuickSort(a, begin, key - 1);
   QuickSort(a, key + 1, end);
}

但是递归的缺陷是如果递归的层次太深,很容易就会导致栈溢出,所以接下来我们就利用栈的知识来优化一下代码
 

void QuickSortNonR(int* a, int begin, int end)
{
	ST st;
	StackInit(&st);
	StackPush(&st, end);
	StackPush(&st, begin);

	while (!StackEmpty(&st))
	{
		int left = StackTop(&st);
		StackPop(&st);

		int right = StackTop(&st);
		StackPop(&st);

		int key = PartSort3(a, left, right);
		// [left, key-1] key [key+1, right]

		if (key + 1 < right)
		{
			StackPush(&st, right);
			StackPush(&st,key + 1);
		}

		if (left < key - 1)
		{
			StackPush(&st, key - 1);
			StackPush(&st, left);
		}
	}

	StackDestroy(&st);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抱着太阳吃雪糕z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值