快速排序非递归版实现

news/2024/5/19 21:14:07 标签: 面试题, 算法, 快速排序

今天研究了一下快速排序如何用非递归算法解决。下面代码,自认为非常简洁,通过简单测试没有发现任何问题,供大家参考。

本程序利用了“栈”

代码如下:

#include <iostream>
#include <stack>
#include <iterator>
#include <algorithm>
using namespace std;


int partition(int data[],int lo,int hi) {
	int v=data[lo];
	while(lo<hi) {  
		while(lo<hi && data[hi]>=v) 
			hi--;
		data[lo]=data[hi];
		while(lo<hi && data[lo]<=v) 
			lo++;
		data[hi]=data[lo];
	}
	data[lo]=v;
	return lo; 
}

void QuickSort_1(int data[],int lo,int hi) {
	stack<int> st;
	int key;
	do {
		while(lo<hi) {
			key=partition(data,lo,hi);   
			st.push(lo);
			st.push(key-1);
			lo=key+1; 
		}
		if(st.empty()) 
			return;
		hi=st.top();
		st.pop();  
		lo=st.top();
		st.pop();  
	} while(true);
}

void QuickSort_2(int data[],int lo,int hi) {
	stack<int> st;
	int key;
	while(lo<hi || !st.empty()) {
		if (lo<hi) {
			key=partition(data,lo,hi);   
			st.push(lo);
			st.push(key-1);
			lo=key+1; 
		} else {
			hi=st.top();
			st.pop();  
			lo=st.top();
			st.pop();
		}
	
	}				  
}

int main() {

	int arr[] = {1,1,1,1,1,1,4,2,3,1};
	int n = sizeof(arr) / sizeof(int);
	
	QuickSort_1(arr, 0, n-1);
	//QuickSort_2(arr, 0, n-1);
	
	copy(arr, arr+n, ostream_iterator<int>(cout, " "));
	cout<<endl;
	
	return 0;
}




http://www.niftyadmin.cn/n/1083313.html

相关文章

CF1548C The Three Little Pigs 题解

CF1548C The Three Little Pigs 算基础的生成函数题了吧。 反正当时隔壁老哥在打 VP 的时候&#xff0c;推了半天 CCC 没有推出来。被我一眼秒了 …\dots… 就是答案肯定是 ∑i0n(3ix)\sum_{i 0} ^ {n} \binom{3i}{x}∑i0n​(x3i​)。 发现这个东西就是个二项式定理。 那么如…

CF756F 题解

CF756F 原本以为校内有神仙要讲评这题&#xff0c;就赶快去做了。结果啊&#xff0c;是我题号记错的 …\dots… 题目大意&#xff1a; 给出一个字符串请解析这个字符串构成的数。 l−rl - rl−r 表示 l∼rl \sim rl∼r 中的所有数&#xff0c; 8−108 -108−10 表示 891089108…

平面图转对偶图的应用

平面图转对偶图 [BeiJing2006]狼抓兔子 这个是经典题&#xff0c;显然就是求一个最小割。然后网络流建立无向图即可。 但是如果数据范围没有那么小呢&#xff1f; 众所周知网络流的复杂度其实挺玄学的&#xff0c;而且这又是一张平面图&#xff0c;不妨将其转化为对偶图。 …

CF1446D2 题解

CF1446D2 Frequency Problem (Hard Version) 讲一种 O(n)O(n)O(n) 的神仙做法&#xff0c;代码转载于 gmh77gmh77gmh77 神仙。 说实话这个我也不懂算不算转载&#xff0c;如果有问题可以直接私聊我。 考虑对于最终答案来说&#xff0c;我们重复计算不符合条件的比较小的区间是…

美团笔试2014-美团网举行女子羽毛球比赛,前端组、后短租、手机组各派了三名运动员参加。比赛前,4名程序员在一起预测比赛结果。

美团网举行女子羽毛球比赛&#xff0c;前端组、后端组、手机组各派了三名运动员参加。比赛前&#xff0c;4名程序员在一起预测比赛结果。甲说&#xff1a;“前端组妹子比较多&#xff0c;这次的前三名非他们莫属。”乙说&#xff1a;“今年与去年可不同了&#xff0c;金银铜牌前…

CF1523H 题解

CF1523H 首先这个东西很像一个 dpdpdp。我们不妨将删点记录成一个状态&#xff0c;然后发现状态数量太多了&#xff0c;我们可以倍增优化一下状态数量。 设 f(i,j,k)f(i, j, k)f(i,j,k) 表示从点 kkk 开始删除了 jjj 个点&#xff0c;走 2i2^i2i 个点能到达的最优的点。 我们…

CF827F Dirty Arkady‘s Kitchen 题解

CF827F Dirty Arkady’s Kitchen 说实话这个拆点和拆边都是可以过的。 发现边是可以重复经过的&#xff0c;那么对于两条边只要考虑奇偶性就好了。 我们考虑对于一条边拆成两部分&#xff0c;一个是起点为奇的&#xff0c;另外一个是偶的。 什么时候一条路径是合法的&#xf…

CF757G Can Bash Save the Day? 题解

CF757G Can Bash Save the Day? 时间复杂度分析好题&#xff08;大雾&#xff09;。 将询问拆成几部分&#xff0c;也就是 dis(u,v)dep(u)dep(v)−2∗dep(Lca(u,v))dis(u, v) dep(u) dep(v) - 2 * dep(Lca(u, v))dis(u,v)dep(u)dep(v)−2∗dep(Lca(u,v))。 显然对于 LcaLca…