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

 //快速排序算法的非递归实现,将右区间左区间放到栈中,每次判断
//栈是不是空,如果不是空的话,就取出栈顶元素,进行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;
	}
}

点赞