快速排序Qsort是所有学习算法和数据结构最基础的一个部分,也是考试题和面试的一个小重点。

快速排序的时间复杂度为O(N*lgN),而且常数因子很小。

  对于随机数据,效率特别高;

  对于构造的恶意数据,最坏复杂度为O(N2),解决方案为采用随机化的快排。

除了时间效率上的优势,快速排序进行就地排序,即在原数组中进行元素交换,仅需要少量临时变量。这也是Qsort在空间上的优势。

注意:快速排序属于不稳定排序。

Qsort本质上是一种分治策略。每次通过数组内的元素交换,使得对于一个选定的元素X摆在合理的位置,即所有X左边的元素都不大于X,X右边的元素都不小于X。这样只需要分别对X左边和右边两个区间分别递归执行相同的过程即可完成整个序列的排序。

对于区间a[l,…,r],我们每次选定a[r]为上述的X。

然后从a[l]开始处理,直到处理到a[r-1]这个元素。处理过程中,把序列维护如下所示的情形:

如图,在逐个元素处理过程中,绿色表示不大于X的这些元素;黄色表示不小于X的这些元素;Y箭头处表示当前正在处理的元素Y;白色的部分表示还未处理的这些元素。

整个过程需要记录的一个最重要的位置是第一个黄色元素的位置,因为后续的交换都是围绕第一个黄色元素位置进行的(当然这个位置不是固定的,会随着元素的增多向后移动)。

比较Y和X,如果Y<=X,那么说明Y可以加入绿色阵营,此时只需要交换Y和第一个黄色位置的值,黄色的区域向右移动一位就可以持续保持当前的性质了;如果Y>X(等于号在哪个判断条件并不重要,为什么?),直接Y加入黄色阵营,啥也不要做,因为性质得到保持。

最后我们得到一个这样的结果,即除了最后一个a[r]没有处理。

此时我们只需要交换a[r]与第一个黄色的值,就可以了。

此时只要对左边和右边分别进行递归分治,就可以完成整个序列的排序了。

实现中还有一些细节请一定注意哦。

最新文章

  1. C++高精度计时器&mdash;&mdash;微秒级时间统计
  2. 制造行业流程管理的“IPO”思维
  3. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)
  4. rpc框架之 thrift 学习 2 - 基本概念
  5. WCF--验证码实现...
  6. Web标准和搜索引擎优化技术
  7. hdu 1872 稳定排序
  8. 一款jquery编写图文下拉二级导航菜单特效
  9. linux运维面试题
  10. 微软提供的API的各个版本之间的区别
  11. 东软实训4-JDBC连接数据库
  12. Tomcat 启动 Debug模式
  13. getch()和getchar()之再讨论
  14. php学习笔记——语言切换
  15. 异常java.lang.NumberFormatException解决
  16. 含有Date属性的对象转化为Json
  17. 从一个例子入门Mysql储存过程
  18. flask 使用宏渲染表单(包含错误信息)
  19. 关于repaint和reflow的笔记
  20. 【转】Nginx学习---深入浅出Nginx的介绍

热门文章

  1. ubuntu打开windows下txt文档乱码问题的解决
  2. exBSGS&#183;BSGS-Senior/扩展的BSGS
  3. BZOJ3676 APIO2014 回文串 Manacher、SA
  4. 重装系统之无法在驱动器0的分区1上安装windows
  5. MySql 数据库移植记录
  6. ThinkPad T43续命记
  7. Ionic App之国际化(1)单个参数的处理
  8. Android自动化测试之Monkeyrunner使用方法及实例
  9. Spark在Windows下的环境搭建(转)
  10. 使用xshell连接服务器,数字键盘无法使用解决办法