快速排序的非递归算法实现

时间:2022-03-28 04:13:01
 //快速排序算法的非递归实现,将右区间左区间放到栈中,每次判断
//栈是不是空,如果不是空的话,就取出栈顶元素,进行Partition
//然后继续将两个子区间放入栈中,进栈可以判断下区间长度>1.
template<typename T>
void NeQuickSort(vector<T>& a, int s, int t){
vector<vector<int>> p(a.size());
p[0] = { s, t };
int k = 1, i = 0, j = 0;
while (k){
i = p[--k][0];
j = p[k][1];
int q = Partition(a, i, j);
if (q + 1<j) p[k++] = { q + 1, j };
if (i<q - 1) p[k++] = { i, q - 1 };
}
}

//快速排序算法的非递归实现,这种方法应该说是尾递归
//的非递归快速排序算法,它只把>1的右区间放入栈中,
//减少了出栈入栈的次数。
template<typename T>
void NoQuickSort(vector<T>& a, int s, int t){
vector<vector<int>> p(a.size());
p[0] = { s, t };
int k = 1, i = 0, j = 0;
while (k || i<j){
if (i >= j){
i = p[--k][0];
j = p[k][1];
}
int q = Partition(a, i, j);
if (q + 1 < j) p[k++] = { q + 1, j };
j = q - 1;
}
}