`
zhangziyueup
  • 浏览: 1173634 次
文章分类
社区版块
存档分类
最新评论

快排的非递归实现

 
阅读更多

#include<iostream>

#include<vector>

#include<stack>

using namespace std;

vector<int>a;

void input()

{

//实现数组元素的初始化

freopen("test.txt","r",stdin);

intc,i,n;

cin>>n;

for(i=0;i<n;i++)

{

cin>>c;

a.push_back(c);

}

}

void output()

{

//输出数组中的元素;

inti;

for(i=0;i<a.size();i++)

cout<<a[i]<<" ";

cout<<endl;

}

int partition(intlow,int high)

{

//在low和high子间元素,实现a[low]之前的元素都小于a[low],

//a[low]之后的元素都大于a[low];

inttemp=a[low];

while(low<high)

{

while(low<high && a[high]>=temp)

high--;

a[low]=a[high];

while(low<high && a[low]<=temp)

low++;

a[high]=a[low];

}

a[low]=temp;

return low;

}

void qSort()

{

stack<int>s;

//用栈s保存要排序的元素的上界位置high和下界位置low,

//每轮快排结束后并得到中轴元素的位置pivotloc,则然后将

//low和pivotloc-1压栈,再将pivotloc+1和high压栈,使得下次分别对

//low到pivotloc-1之间的元素快排,和对pivotloc+1到high之间的元素实现快排;

//即可达到对整个数组的排序;

intlow=0,high=a.size()-1,pivotloc;

s.push(low);

s.push(high);

while(!s.empty())

{

high=s.top();

s.pop();

low=s.top();

s.pop();

if(low<high)

{

pivotloc=partition(low,high);

//cout<<"该轮结束后的元素为:";

//output();

s.push(pivotloc+1);

s.push(high);//将pivotloc+1和high压栈,使得下次将pivotloc+1到high之间的元素排序;

s.push(low);

s.push(pivotloc-1);//将low和pivotloc-1压栈,使得下次将low到pivotloc-1之间的元素排序;

}

}

}

int main()

{

input();

cout<<"排序前的元素为:";

output();

qSort();

cout<<"排序后的元素为:";

output();

return 0;

}

分享到:
评论

相关推荐

    C++ 中快排的递归和非递归实现

    主要介绍了C++ 中快排的递归和非递归实现的相关资料,需要的朋友可以参考下

    c#快速排序的非递归算法

    快速排序一般用的是递归算法,利用系统的提供的栈结构,而此非递归算法没有利用栈,巧妙完成了排序,并提供人机交互界面

    快速排序的非递归实现

    利用栈来消除递归 模拟快速排序的过程 实现非递归的快速排序

    快排与二分检索递归与非递归

    快排与二分检索的递归与非递归算法分析与设计

    快速排序的非递归算法.doc

    用C实现了快速排序的非递归算法. int quickpass ( sqlist &R, int low, int high ) { ... } void quicksort ( sqlist &r, int low, int high ) { ... }

    [排序算法] 9. 归并排序递归与非递归实现及算法复杂度分析(分治算法、归并排序、复杂度分析)

    代码实现2.1 递归实现2.2 优化—非递归实现3. 性能分析 1. 基本思想 在数列排序中,如果只有一个数,那么它本身就是有序的;如果只有两个数,那么一次比较就可以完成排序。也就是说,数越少,排序越容易。那么,...

    Java ArrayList实现的快排,归并排序,堆排序

    用ArrayList实现的排序算法,希望对有需要的同学有帮助,如有错误请指出。JDK版本为1.7

    排序算法的分析

    C语言实现快排、归并排序、快排改进算法的递归和非递归算法 。其实以上算法的原理都很简单。在本科阶段,我们对这几个算法的基本原理都应该十分熟悉,但对于我,真正落实到是实现这几算法,之前几乎没有试过。现在刚...

    数据结构与算法综合资料库.CHM

    汉诺塔的非递归 回朔法一例 几道有趣的算法题 阶梯问题的递归解法 精确迭代法 矩阵求逆的快速算法 快 速 排 序 马踏棋盘问题 冒 泡 法 排序算法 五例 排序算法一览 穷举密码算法 如何实现DES算法 入栈与出栈的所有...

    数据结构与算法综合资料库

    汉诺塔的非递归 回朔法一例 几道有趣的算法题 阶梯问题的递归解法 精确迭代法 矩阵求逆的快速算法 快 速 排 序 马踏棋盘问题 冒 泡 法 排序算法 五例 排序算法一览 穷举密码算法 如何实现DES算法 入栈与出栈的所有...

    数据结构及算法编程(阿蒙工作室)

    ☆ 汉诺塔的非递归 ☆ 何谓数据结构 ☆ 回朔法一例 ☆ 几道有趣的算法题 ☆ 阶梯问题的递归解法 ☆ 精确迭代法 ☆ 矩阵求逆的快速算法 ☆ 快 速 排 序 ☆ 马踏棋盘问题 ☆ 冒 泡 法 ☆ 排序算法 五例 ☆ 排序算法...

    数据结构课设

    任务 :编程实现二叉树的建立,层次遍历,(递归和非递归方法)先序、中序、后序,二叉树的高度、宽度。二叉排序树的建立、插入、删除; 基本要求:从文件中读入建树信息,树的节点数目不小于20个,树的高度不小于5...

    数据结构与算法.xmind

    当大量数据,且重复数多时,用三路快排 插入排序 直接插入排序 思想 将数据插入到一个有序的序列中 做法 外层for循环控制需要排序的趟数(从1开始因为将第0位看成了有序...

    leetcode中国-LeetCode:力扣解决方案

    leetcode中国 ...实现二叉树的前中后遍历,非递归版本。注意先序遍历借助栈实现时,入栈顺序是根右左;而另一种版本的后序遍历,可以将将中右左遍历的结果存在另一个栈中,再次遍历就是后序的结果。

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY的功能 277 10.4.1 LEVEL伪列 278 10.4.2 ...

    javascript入门笔记

    Javascript Basic 1、Javascript 概述(了解) Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 JS解释器/引擎 是JS的运行环境: 1、独立安装的JS解释器 - NodeJS 2、嵌入在浏览器中的JS...

Global site tag (gtag.js) - Google Analytics