快排的c++实现(两种实现方式)
快速排序算法是现在用的最广的排序算法,也是效率最高的。它有两种实现方式,一种是定轴法,另外一种是挖坑法。这里简单介绍一下两种实现方法的思想,并附上C++实现代码。
(一)定轴法:
1.备份对轴(首记录)
2.取两个指针left和right,初始值分别是序列的第二个元素和最后一个元素,并且left<=right
3.移动两个指针
*从right所指的位置向左搜索,找到第一个小于轴的元素
*从left所指的位置向右搜索,找到第一个大于轴的元素
*找到后如果left<right,那么就交换两个位置的值
4.重复上述过程,知道left>right
5.把轴放到right的位置,并且将right位置的值放到第一位
6.分别将right位置左边的和右边的进行上述的递归
C++代码实现如下:
void quickSort(int* A,int first,int last){ //数组A,first是第一个元素下标,last是最后一个元素下标if(last<=first) //到了长度小于1这种情况已经是有序列了return;int pivot=A[first];int left=first+1; //left等于第二个元素int right=last; int temp;while(left<=right){while(A[right]>pivot&&right>=left)//找到一个比first小的,但必须保证left值小于等于right值right--;while(A[left]<pivot&&left<=right) //找到一个比first大的,但得保证left值小于等于right值left++;if(left>=right) //说明已经是相对有序序列,无需交换break;temp=A[left]; //交换位置A[left]=A[right];A[right]=temp;left++,right--; //相应的进一位}A[first]=A[right]; //因为right一定是停在从右到左第一个小于first的数上,交换之后,//依然能保证first值左边的比first小,右边的比first大A[right]=pivot;quickSort(A,first,right-1); //左半部分quickSort(A,left,last); //右半部分
}
(二)挖坑法:
1.备份轴记录
2.取两个指针low和high,初始值就是序列的两端下标,保证low<=high
3.移动两个指针
*从high向左找到第一个小于轴的元素, 放在low的位置
*从low向右找到第一个大于轴的元素,放在high的位置
4.重复,直到low=high,
5.把轴放在low所指的位置
6.分别对low所指的位置的左边和右边进行上述的递归
C++实现代码如下:
void quickSort(int s[], int l, int r)
{if(l<r){ int low=l; //左边第一个,因为第一个已经用pivot保存了int high=r; //右边int pivot = s[l]; //第一个,已被保存while(low<high) //当左小于右,当相等的时候会跳出循环{while(low<high&&s[high]>= pivot) // 从右向左找第一个小于x的数high--; if(low<high) s[low++] = s[high];while(low<high&&s[low]<pivot) // 从左向右找第一个大于等于x的数low++; if(low<high) s[high--] = s[low];}s[low]=pivot; quickSort(s, l, low - 1); //low左边递归调用quickSort(s, low + 1, r); //low右边递归调用}
}
快排的c++实现(两种实现方式)相关推荐
- 快排算法及常见两种常见优化方法
简书同步发布 正常快排 最近在找实习,然而我觉得博客还是要坚持日更,我相信时间总是挤出来的,不扯淡了,快排这是个面试常考题,今天主要着重于讲他的优化方法,那我就直接先贴快排代码,再来细细道来我所知道的 ...
- Java两种排序方式快慢比较
2019独角兽企业重金招聘Python工程师标准>>> Java中List的排序方式有两种,现在我们测试下这两种排序方式的快慢吧,我们需要用到两个类, 一个是运行程序的Main类,另 ...
- Vivado IP的两种综合方式:Global 和 Out-Of-Context
在最新的Vivado的版本中,定制IP的时候,会有一个综合方式的选择,如下图所示.可以看到一种叫做"Global",一种叫"Out-Of-Context (OOC)&qu ...
- 一文读懂工业设备的两种通讯方式:现场总线和工业以太网
随着传统制造企业正在加快智能制造转型的进程,工业互联网迅速在全世界范围内兴起.在工业互联网的技术构架中,通过各类通讯方式接入不同设备.系统和产品,来采集海量数据是其重要的一环.本文将重点介绍工业底层设 ...
- wdcp支持两种安装方式
v3.2版本已发布,支持多PHP版本共存共用,支持SSL证书,更多可看论坛 v3版讨论区 更多安装说明请看 http://www.wdlinux.cn/bbs/thread-57643-1-1.htm ...
- 探究Redis两种持久化方式下的数据恢复
对长期奋战在一线的后端开发人员来说,都知道redis有两种持久化方式RDB和AOF,虽说大家都知道这两种方式大概运作方式,但想必有实操的人不会太多. 这里是自己实操两种持久化方式的一点点记录. 先看以 ...
- python定义字符串变量有两种常用方式_Python 1基础语法二(标识符、关键字、变量和字符串)...
一.标识符 标识符就是程序员自己命名的变量名.名字需要有见名知义的效果,不要随意起名 :比如 a=1 a是个变量,a这个变量名属于标识符 1 company = '小米 2 employeeNum = ...
- 1000个苹果要分到10个箱子中去 两种分析方式
前些日子接到了一个Java开发的电话面试,接了电话人家开门见山就直接说现在是否方便,什么什么时候收到您的简历投递,是否可以进行电话面试,如果可以就可以直接开始了,emmm,这么突然,也没好意思问公司名 ...
- oracle 两种优化器,Oracle的优化器有两种优化方式(一)
Oracle的优化器有两种优化方式(整理), 2010-04-13 RBO方式:基于规则的优化方式(Rule-Based Optimization,简称为RBO) 优化器在分析SQL语句时,所遵循的 ...
最新文章
- java29:Map
- js-在url后面添加时间戳清除浏览器打开页面的缓存
- 【算法系列】一道面试算法题
- JAVA基础-面向对象07
- 判断回文链表(剑指offer.027)
- python 链表两数相加
- SAP标准成本核算重要环节详解
- grpc java 泛型_gRPC中Any类型的使用(Java和NodeJs端)
- 分布式系统常用思想和技术
- Qt获取本地ip地址
- 步进电机驱动A4988,步进电机驱动程序编写
- 在deepin 上安装佳能MF 4700打印机驱动
- 基于低代码平台的OA系统,更灵活高效!
- 12306购票流程分析
- python什么证书最有价值,python哪个证书含金量高
- 使用Python实现键盘记录器和邮箱自动通知
- 学fpga(hls之vivado、zynq和petalinux)
- 优势明显 三星、SK海力士称雄DRAM市场
- 组织效能及人均效能指标大全和计算方法
- Vue+element ui实现好看的个人中心