快速排序算法是现在用的最广的排序算法,也是效率最高的。它有两种实现方式,一种是定轴法,另外一种是挖坑法。这里简单介绍一下两种实现方法的思想,并附上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++实现(两种实现方式)相关推荐

  1. 快排算法及常见两种常见优化方法

    简书同步发布 正常快排 最近在找实习,然而我觉得博客还是要坚持日更,我相信时间总是挤出来的,不扯淡了,快排这是个面试常考题,今天主要着重于讲他的优化方法,那我就直接先贴快排代码,再来细细道来我所知道的 ...

  2. Java两种排序方式快慢比较

    2019独角兽企业重金招聘Python工程师标准>>> Java中List的排序方式有两种,现在我们测试下这两种排序方式的快慢吧,我们需要用到两个类, 一个是运行程序的Main类,另 ...

  3. Vivado IP的两种综合方式:Global 和 Out-Of-Context

    在最新的Vivado的版本中,定制IP的时候,会有一个综合方式的选择,如下图所示.可以看到一种叫做"Global",一种叫"Out-Of-Context (OOC)&qu ...

  4. 一文读懂工业设备的两种通讯方式:现场总线和工业以太网

    随着传统制造企业正在加快智能制造转型的进程,工业互联网迅速在全世界范围内兴起.在工业互联网的技术构架中,通过各类通讯方式接入不同设备.系统和产品,来采集海量数据是其重要的一环.本文将重点介绍工业底层设 ...

  5. wdcp支持两种安装方式

    v3.2版本已发布,支持多PHP版本共存共用,支持SSL证书,更多可看论坛 v3版讨论区 更多安装说明请看 http://www.wdlinux.cn/bbs/thread-57643-1-1.htm ...

  6. 探究Redis两种持久化方式下的数据恢复

    对长期奋战在一线的后端开发人员来说,都知道redis有两种持久化方式RDB和AOF,虽说大家都知道这两种方式大概运作方式,但想必有实操的人不会太多. 这里是自己实操两种持久化方式的一点点记录. 先看以 ...

  7. python定义字符串变量有两种常用方式_Python 1基础语法二(标识符、关键字、变量和字符串)...

    一.标识符 标识符就是程序员自己命名的变量名.名字需要有见名知义的效果,不要随意起名 :比如 a=1 a是个变量,a这个变量名属于标识符 1 company = '小米 2 employeeNum = ...

  8. 1000个苹果要分到10个箱子中去 两种分析方式

    前些日子接到了一个Java开发的电话面试,接了电话人家开门见山就直接说现在是否方便,什么什么时候收到您的简历投递,是否可以进行电话面试,如果可以就可以直接开始了,emmm,这么突然,也没好意思问公司名 ...

  9. oracle 两种优化器,Oracle的优化器有两种优化方式(一)

    Oracle的优化器有两种优化方式(整理), 2010-04-13 RBO方式:基于规则的优化方式(Rule-Based Optimization,简称为RBO)  优化器在分析SQL语句时,所遵循的 ...

最新文章

  1. java29:Map
  2. js-在url后面添加时间戳清除浏览器打开页面的缓存
  3. 【算法系列】一道面试算法题
  4. JAVA基础-面向对象07
  5. 判断回文链表(剑指offer.027)
  6. python 链表两数相加
  7. SAP标准成本核算重要环节详解
  8. grpc java 泛型_gRPC中Any类型的使用(Java和NodeJs端)
  9. 分布式系统常用思想和技术
  10. Qt获取本地ip地址
  11. 步进电机驱动A4988,步进电机驱动程序编写
  12. 在deepin 上安装佳能MF 4700打印机驱动
  13. 基于低代码平台的OA系统,更灵活高效!
  14. 12306购票流程分析
  15. python什么证书最有价值,python哪个证书含金量高
  16. 使用Python实现键盘记录器和邮箱自动通知
  17. 学fpga(hls之vivado、zynq和petalinux)
  18. 优势明显 三星、SK海力士称雄DRAM市场
  19. 组织效能及人均效能指标大全和计算方法
  20. Vue+element ui实现好看的个人中心

热门文章

  1. spawn-fcgi 启动python 程序失败
  2. 1.4.2.4. SAVING(Core Data 应用程序实践指南)
  3. 使用js对select动态添加和删除OPTION示例代码
  4. 汇编语言---函数调用栈
  5. 一起学习linux之lamp脚本
  6. /proc/sys/net/ipv4 详解2
  7. mysql replication
  8. [转帖]每天看一遍,释怀所有难过
  9. 通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行
  10. 把庞大的 npm script 拆到单独文件中