《算法》第二章——快排非递归实现
来源:互联网 发布:网站测试 软件测试 编辑:程序博客网 时间:2024/05/17 04:50
思路:
其实就是用栈保存每一个待排序子串的首尾元素下标,下一次while循环时取出这个范围,对这段子序列进行partition操作。
代码:
#include<iostream>#include<stack>using namespace std;int partition(int *a,int lo,int hi){//每次取第一个元素为pivot int pivot = a[lo]; while(lo < hi) { //lo位置的数被存起来了,所以先从hi往前找第一个较小的元素,然后放到lo处 while(lo < hi && pivot <= a[hi]) hi--; a[lo] = a[hi]; //hi位置的数被存起来了,所以从lo往前找第一个较大的元素,然后放到hi处 while(lo < hi && pivot >= a[lo]) lo++; a[hi] = a[lo]; } /*此时lo == hi*/ a[lo] = pivot; return lo;}//非递归算法void quicksort(int *a,int lo,int hi){ stack<int> st; if(lo < hi) {// int p = partition(a,lo,hi);// if(lo < p - 1)// {// st.push(lo);// st.push(p-1);// }// if(p + 1< hi)// {// st.push(p+1);// st.push(hi);// } st.push(lo); st.push(hi); } while(!st.empty()) { int hi_t = st.top(); st.pop();//注意栈是后进先出的 int lo_t = st.top(); st.pop(); int p = partition(a,lo_t,hi_t); if(lo_t < p - 1) { st.push(lo_t); st.push(p-1); } if(p + 1< hi_t) { st.push(p+1); st.push(hi_t); } }}int main(){ int a[]={3,4,2,1,6,3,4}; int len = sizeof(a)/sizeof(int); quicksort(a,0,len - 1); for(int i = 0;i < len;i++) cout<<a[i]<<" "; cout<<endl;}
0 0
- 《算法》第二章——快排非递归实现
- 算法——全排列递归实现
- 算法—递归实现 C(m,n)
- 【数据结构与算法】汉诺塔算法——java递归实现
- 算法洗脑系列(8篇)——第二篇 递归思想
- 算法洗脑系列(8篇)——第二篇 递归思想
- 算法洗脑系列(8篇)——第二篇 递归思想
- 算法洗脑系列(8篇)——第二篇 递归思想
- 算法设计与分析:第二章 递归 2.2买商品
- 算法设计与分析:第二章 递归 2.7全排列
- 算法珠玑第三章第二题线性递归级数
- 算法——递归算法
- 算法——递归
- 算法——递归
- 算法——递归
- 常用算法—递归
- 汉诺塔算法——C语言递归实现
- 第三篇:汉诺塔算法——C语言递归实现
- TCP/IP、Http、Socket的区别
- JDBC
- ubuntu14.04安装mysql服务
- SQL中的取整函数FLOOR、ROUND、CEIL、TRUNC、SIGN
- Java 8 新特性
- 《算法》第二章——快排非递归实现
- Qt的多线程编程注意事项
- 【CodeVS】1978 Fibonacci数列3
- 神经网络端到端序列学习(一)
- 无限的路
- Convert xml string to obj
- Picnic Planning poj 1639 k度限制生成树
- SQL基础--常见SQL查询
- FPGA超声相控延时算法和相位延时技术