快速排序partition过程常见的两种写法+快速排序非递归实现
这里不详细说明快速排序的原理,具体可参考here
快速排序主要是partition的过程,partition最常用有以下两种写法
第一种:
int mypartition(vector<int>&arr, int low, int high)
{
int pivot = arr[low];//选第一个元素作为枢纽元
while(low < high)
{
while(low < high && arr[high] >= pivot)high--;
arr[low] = arr[high];//从后面开始找到第一个小于pivot的元素,放到low位置
while(low < high && arr[low] <= pivot)low++;
arr[high] = arr[low];//从前面开始找到第一个大于pivot的元素,放到high位置
}
arr[low] = pivot;//最后枢纽元放到low的位置
return low;
}
第二种:
int mypartition(vector<int>&arr, int low, int high)
{
int pivot = arr[high];//选最后一个元素作为枢纽元
int location = low-1;//location指向比pivot小的元素段的尾部
for(int i = low; i < high; i++)//比枢纽元小的元素依次放在前半部分
if(arr[i] < pivot)
swap(arr[i], arr[++location]);
swap(arr[high], arr[location+1]);
return location+1;
}
当第二种方法也可以选择第一个元素作为枢纽(当我们对链表进行快排时选用这种做法),对上面代码稍作改动即可,具体改动见注释 本文地址
int mypartition(vector<int>&arr, int low, int high)
{
int pivot = arr[low];//选第一个元素作为枢纽元
int location = low;//location指向比pivot小的元素段的尾部
for(int i = low+1; i <= high; i++)//比枢纽元小的元素依次放在前半部分
if(arr[i] < pivot)
swap(arr[i], arr[++location]);
swap(arr[low], arr[location]);//注意和前面的区别,是为了保证交换到头部的元素比pivot小
return location; }
快排主函数如下:
void quicksort(vector<int>&arr, int low, int high)
{
if(low < high)
{
int middle = mypartition(arr, low, high);
quicksort(arr, low, middle-1);
quicksort(arr, middle+1, high);
}
}
快排非递归实现
主要思想是用栈来保存子数组的左右边界,一下代码中用数组模拟栈
void quicksort_unrecursion(vector<int>&arr)//快速排序非递归
{
int mystack[2000];//假设递归不超过1000层
//栈中保存下次需要排序的子数组的开始位置和结束位置
int top = -1;
mystack[++top] = 0;
mystack[++top] = arr.size() - 1;
while(top > 0)//栈非空
{
int high = mystack[top--], low = mystack[top--];
int middle = mypartition(arr, low, high);
if(middle+1 < high)//右边子数组入栈
{
mystack[++top] = middle+1;
mystack[++top] = high;
}
if(low < middle-1)//左边子数组入栈
{
mystack[++top] = low;
mystack[++top] = middle-1;
}
}
}
【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3665038.html
快速排序partition过程常见的两种写法+快速排序非递归实现的更多相关文章
- 用Python计算幂的两种方法,非递归和递归法
用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...
- ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法
ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块 --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...
- EF架构~linq模拟left join的两种写法,性能差之千里!
回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...
- Java 获取*.properties配置文件中的内容 ,常见的两种方法
import java.io.InputStream; import java.util.Enumeration; import java.util.List; import java.util.Pr ...
- 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。
比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...
- java 路径分隔符File.separator 以及 路径两种写法"/"和"\\"
一.File.separator File file=new File(); 这句是新建一个文件.file.separator这个代表系统目录中的间隔符,说白了就是斜线,不过有时候需要双线,有时候是单 ...
- iOS中表视图单元格事件用nib和storyboard的两种写法总结
从ios6开始,苹果公司推出了storyborad技术取代了nib的写法,这样代码量确实少写了很多,也比较简洁.但是,从学习的角度来说,阿堂认为 用nib的写法,虽然多了些代码,但是对于掌握知识和原理 ...
- linq和ef关于group by取最大值的两种写法
LINQ: var temp = from p in db.jj_Credentials group p by p.ProfessionID into g select new { g.Key, Ma ...
- ThinkPHP中Widget的两种写法及调用
Widget扩展一般用于页面组件的扩展,在页面根据需要输出不同的内容,下面介绍一下ThinkPHP中Widget的两种写法及调用 写法一: ArticlWidget.class.php文件: clas ...
随机推荐
- Fiddler抓包5-接口测试(Composer)
前言 Fiddler最大的优势在于抓包,我们大部分使用的功能也在抓包的功能上,fiddler做接口测试也是非常方便的. 对应没有接口测试文档的时候,可以直接抓完包后,copy请求参数,修改下就可以了. ...
- python + slenium自动化测试设置元素等待
WebDriver 提供了两种类型的等待:显式等待和隐式等待. 显式等待 显式等待使 WebdDriver 等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常 (TimeoutExcepti ...
- JQuery插件jqModal应用详解(十二)
JqModal 是jQuery的一个插件,用来在web浏览器中显示自定义通告,而且它为通用窗口框架奠定了基础. 1. 多模型支持 2. 支持拖拽和重定义大小 3, 支持远程加载窗口内容(ajax和if ...
- linux下安装openoffice
一.环境 centos6.9 安装jdk1.6及以上 二.安装依赖 yum install libXext.x86_64 -y yum install freetype -y yum groupins ...
- 【AtCoder】AISing Programming Contest 2019
本来以为是1199rated的..仔细一看发现是1999,所以就做了一下 这场涨分很轻松啊...为啥又没打 等pkuwc考完我一定打一场atcoder(咕咕咕,咕咕咕,咕咕咕咕咕咕咕~) 但是其实我思 ...
- BZOJ4990 [Usaco2017 Feb]Why Did the Cow Cross the Road II 动态规划 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4990 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...
- 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...
- 071 HBase的安装部署以及简单使用
一:下载安装 1.下载安装 2.开启hadoop与zookeeper 3.修改配置文件hbase-env export JAVA_HOME=/opt/modules/jdk1.7.0_67 expor ...
- 洛谷 P1057 传球游戏 【dp】(经典)
题目链接:https://www.luogu.org/problemnew/show/P1057 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游 ...
- 水晶报表Win10(64bit)VS2013安装成功
windows 10 64 VS2013安装 CR For VS 13_0_18 安装过程没有报错 安装成功http://downloads.businessobjects.com/akdlm/cr4 ...