排序(4):快速排序

2017年12月26日13:11:04 4 3,223 °C
摘要

快速排序是一种交换排序,它由C. A. R. Hoare在1962年提出。

排序(4):快速排序

一、前言

快速排序是一种交换排序,它由C. A. R. Hoare1962年提出。

二、算法思想

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。

然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

动态效果示意图:

排序(4):快速排序

详细的图解往往比大堆的文字更有说明力,所以直接上图:

排序(4):快速排序

上图中,演示了快速排序的处理过程:

初始状态为一组无序的数组:24513

经过以上操作步骤后,完成了第一次的排序,得到新的数组:12543

新的数组中,以2为分割点,左边都是比2小的数,右边都是比2大的数。

因为2已经在数组中找到了合适的位置,所以不用再动。

2左边的数组只有一个元素1,所以显然不用再排序,位置也被确定。(注:这种情况时,left指针和right指针显然是重合的。因此在代码中,我们可以通过设置判定条件left必须小于right,如果不满足,则不用排序了)。

而对于2右边的数组543,设置left指向5right指向3,开始继续重复图中的一、二、三、四步骤,对新的数组进行排序。

1、代码

C++:

运行结果:

排序(4):快速排序

Python:

运行结果同上。

三、算法分析

1、快速排序算法的性能

排序(4):快速排序

2、时间复杂度

当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差。

而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。

所以,数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。

3、时间复杂度

快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 NlogN次的分割处理,所以占用空间也是 NlogN 个。

4、算法稳定性

在快速排序中,相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。

 

本站整理自:

http://www.cnblogs.com/jingmoxukong/p/4302891.html

https://61mon.com/index.php/archives/201/

weinxin
微信公众号
分享技术,乐享生活:Jack Cui公众号每周五推送“程序员欢乐送”系列资讯类文章,欢迎您的关注!
Jack Cui

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:4   其中:访客  2   博主  2

    • avatar qianbaidu 来自天朝的朋友 谷歌浏览器 Windows 10 北京市海淀区 联通 1

      左右指针应该是交换值吧,赋值的话有的值可能就被覆盖了,参见:
      http://developer.51cto.com/art/201403/430986.htm

        • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 百度网讯科技联通节点

          @qianbaidu 不会覆盖哦,操作有些不同而已,我这个是用base,存储了,不会丢失。

        • avatar 近光 来自天朝的朋友 谷歌浏览器 Windows 10 湖北省武汉市 联通 0

          快排的空间复杂度是logN到N吧

            • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器  Android 8.0.0 MIX 2 Build/OPR1.170623.027 辽宁省沈阳市 联通GSM/WCDMA/LTE共用出口

              @近光 可以参考这里,http://m.nowcoder.com/questionTerminal?uuid=6e7113e30a7c4033befd11ece4f1f167