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