这里不详细说明快速排序的原理,具体可参考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过程常见的两种写法+快速排序非递归实现的更多相关文章

  1. 用Python计算幂的两种方法,非递归和递归法

    用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...

  2. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  3. EF架构~linq模拟left join的两种写法,性能差之千里!

    回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...

  4. Java 获取*.properties配置文件中的内容 ,常见的两种方法

    import java.io.InputStream; import java.util.Enumeration; import java.util.List; import java.util.Pr ...

  5. 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。

    比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...

  6. java 路径分隔符File.separator 以及 路径两种写法"/"和"\\"

    一.File.separator File file=new File(); 这句是新建一个文件.file.separator这个代表系统目录中的间隔符,说白了就是斜线,不过有时候需要双线,有时候是单 ...

  7. iOS中表视图单元格事件用nib和storyboard的两种写法总结

    从ios6开始,苹果公司推出了storyborad技术取代了nib的写法,这样代码量确实少写了很多,也比较简洁.但是,从学习的角度来说,阿堂认为 用nib的写法,虽然多了些代码,但是对于掌握知识和原理 ...

  8. 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 ...

  9. ThinkPHP中Widget的两种写法及调用

    Widget扩展一般用于页面组件的扩展,在页面根据需要输出不同的内容,下面介绍一下ThinkPHP中Widget的两种写法及调用 写法一: ArticlWidget.class.php文件: clas ...

随机推荐

  1. 使用匿名内部类调用start方法

    package chapter03;//类实现接口public class WD implements Runnable{//重写接口的方法 @Override public void run() { ...

  2. SqlServer索引碎片

    1.产生碎片的操作 通过sys.dm_index_physical_stats来查看,索引上的页不在具有连续性时就会产生碎片,碎片是索引上页拆分的物理结果. (1).插入操作: INSERT操作在聚集 ...

  3. (转载)关于一些对location认识的误区

    原文:https://www.cnblogs.com/lidabo/p/4169396.html 关于一些对location认识的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. ...

  4. 《Java程序性能优化》之并发优化

    第四章 并行程序优化 1.非阻塞同步避免了基于锁的同步的缺陷,无锁算法没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销.CAS算法:包含3个参数CAS(v,e,n).V表示要更新的变量,E表示 ...

  5. day8--socket文件传输

    FTP server 1.读取文件名 2.检测文件是否存在 3.打开文件 4.检测文件大小(告诉客户端发送文件的大小) 5.发送文件大小和MD5值给客户端,MD5 6.等待客户端确认(防止粘包) 7. ...

  6. zstu 4247-萌新的旅行

    题目大意: zstu的萌新们准备去自助旅行,他们租了一辆吉普车,然后选择了n个城市作为游览地点.然后他们惊喜的发现他们选择的城市刚好绕城一个环. 也就是说如果给所有城市按照0,1,2,……,n-1编号 ...

  7. POJ1456 Supermarket 并查集

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1456 题意概括  一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该 ...

  8. BZOJ4972 八月月赛 Problem B 小Q的方格纸 二维前缀和

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4972 八月月赛Problem B 题目概括 一个矩阵,一坨询问,问矩阵中一个特定方向的等腰直角三角 ...

  9. 爬虫三Scrapy

    Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人 ...

  10. spark加载模型与gRPC与JSF与JDQ冲突

    spark与JSF冲突解决方式 <dependency> <groupId>org.apache.spark</groupId> <artifactId> ...