欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-24 13:15:18
...
 //快速排序算法的非递归实现,将右区间左区间放到栈中,每次判断
//栈是不是空,如果不是空的话,就取出栈顶元素,进行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;
	}
}