排序(4):快速排序

2017年12月26日13:11:04 13 15,588 °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 个空间存储基准值。而快速排序的大概需要 logN次的分割处理,所以占用空间也是 logN 个。

4、算法稳定性

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

 

本站整理自:

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

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

weinxin
微信公众号
分享技术,乐享生活:微信公众号搜索「JackCui-AI」关注一个在互联网摸爬滚打的潜行者。
Jack Cui

发表评论

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

目前评论:13   其中:访客  8   博主  5

    • 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

            • avatar coalvalin 来自天朝的朋友 谷歌浏览器 Windows 7 北京市 北京电信互联网数据中心 1

              您好,快排的空降复杂度博客里写的nlogn 是不是logn啊

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

                  @coalvalin 对,是O(logn),最坏的时候是O(n)。
                  我改下,感谢。

                • avatar chris_33 来自天朝的朋友 搜狗浏览器 Windows 7 中国 移动 3

                  老大,快速排序在每次分割的过程中,需要 1 个空间存储基准值,而快速排序的大概需要 log2N次的分割,所以占用空间也是 log2N 个不是么?

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

                      @chris_33 是logn,2可以去掉,底数没有意义。

                    • avatar a 来自天朝的朋友 谷歌浏览器 Windows 10 广东省广州市 电信 1

                      3 4 7 11 4 5 6为什么这个数组用快排不行呢

                        • avatar a 来自天朝的朋友 谷歌浏览器 Windows 10 广东省广州市 电信 1

                          @a 对的,看错了。。。

                        • avatar 小白 来自天朝的朋友 谷歌浏览器 Windows 10 湖南省岳阳市 移动 1

                          你好,jack,请问一个比较愚蠢的问题,C++和python版本两个用于快速排序的函数中都没有返回值,为什么在main函数里面cout<<result 或者 print(input_list)后出来的是排序后的值呢?

                            • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 电信

                              @小白 刷题平台就是这样的,要求输出这个值

                                • avatar 小白 来自天朝的朋友 谷歌浏览器 Windows 10 湖南省岳阳市 移动 1

                                  @Jack Cui Jack, 我还是有点没明白。比如说:
                                  QuickSort(result, 0, result.size() – 1); // 这个地方没有写 result = QuickSort(….)
                                  cout << "排序后" << endl;
                                  for (int i = 0; i < result.size(); i++){
                                  cout << result[i] << " "; // 这个地方我自己写的代码,打印出来的都是原来的result,也就是result = test,是没有排序的数组,就是排序前的数组。
                                  }
                                  QuickSort这个函数中没有return result,在main中只是直接调用了Quicksort,那如何将main函数中的变量result改变的呢??
                                  感谢