C++快速排序的非递归实现

  为了便于将递归函数转变为非递归,我们需要用到栈的这个数据结构进行手动递归,但是通过栈实现非递归,会有一个状态记录问题,于是需要设计一个标签来记录入栈元素的状态。具体实现代码如下,并附上测试代码

#include <iostream>
#include <random>
#include <vector>
#include <ctime>
#include <stack>

using namespace std;
struct tag {
	int left;
	int right;
};//标记
template<typename T>
void sswap(T &a, T &b) {
	T temp;
	temp = a;
	a = b;
	b = temp;
};//交换函数
template<typename T>  //递归转二叉树前序遍历实现递归转非递归
void quicksort(T *array, int length) {
	std::stack<tag> tagset;
	tag tp={ 0,length - 1 };
	int mid,l,r;
	l = 0;
	r = length - 1;
	mid = (l + r) / 2;
	T temp;
	while (true){
			sswap(array[mid], array[r]);
			temp = array[r];
			while (l < r)
			{
				while ((l < r) && (temp > array[l]))
					l++;
				if (l < r) {
					array[r] = array[l];
					r--;
				}
				while ((l < r) && (temp < array[r]))
					r--;
				if (l < r) {
					array[l] = array[r];
					l++;
				}
			}
				array[l] = temp;
				if (tp.right >(l + 1))
					tagset.push({ l + 1,tp.right });
				if (tp.left<(l - 1)) {
					r = l - 1;
					l = tp.left;
					tp.left = l;
					tp.right = r;
					mid = (l + r) / 2;
				}
				else if(!tagset.empty()){
					tp = tagset.top();
					tagset.pop();
					r = tp.right;
					l = tp.left;
					mid = (l + r) / 2;
				}
				else return;
	}
};
#define N 100
int main(){
	default_random_engine e(time(0));
	uniform_int_distribution<unsigned> u(0,N);
	int num[N];
	for(int i=0;i<N;i++){
		num[i]=u(e);
	}
	quicksort(num,N);
	for(int i=0;i<N;i++)
		printf("%d\n",num[i]);


}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值