2.3 快速排序

应用最广泛的排序算法:1:适用于各种不同的输入数据且在一般应用中比其他算法都要快。

它是原地排序(只需一个很小的栈),且将数组排序的运行时间是NlogN级别。

主要缺点:非常脆弱。

快速排序与归并排序对比

1.都是一种分治的排序算法

2.归并是将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序

快排是当两个子数组都有序时,整个数组也就有序了。

3.归并是递归调用发生在处理数组之前,快排是发生在处理数组之后。

4.归并是稳定排序,快排不稳定




二 性能特点

简洁性:切分方法的内循环会用一个递增的索引将数组元素和一个定值比较。归并排序和希尔排序一般比快速排序慢,其原因就是它们还在内循环移动数据。

比较次数很少。

基本实现有一个潜在的缺点:在切分不平衡时可能会极为低效。所以我们在快排前将数组随机排序。

总得来说,算法2.5的运行时间在1.39NlogN的某个常数因子的范围之内。归并排序也能做到这一点,但是快排一般会更快,因为它移动数据的次数更少。


三 算法改进

3.1 切换到插入排序

       排序小数组用插入排序

3.2 三取样切分

       使用子数组的一小部分元素的中位数来切分数组。这样做得到的切分更好,但代价是需要          计算中位数。

       人们发现将取样大小设为3并用大小居中的元素切分的效果最好。

3.3 熵最优的排序

        Dijkstra 三向切分的快速排序


        对于只有若干不同主键的随机数组,归并排序的时间复杂度是线性对数的,而三向切分快速排序则是线性的。


答疑

1.随机地将数组打乱似乎占了排序用时的一大部分,这么做值得吗?

值得。这能够防止出现最坏情况并使运行用时可以预计。

2.为什么都将注意力放在重复元素上?

这个问题直接影响到实际应用中的性能,一些老的实现对含有大量重复元素的数组排序时用时超过平方级别。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.基本特点 ①原地排序(之U型要很小的辅助栈)②将长度为N的数组排序所需要的时间和NlgN成正比(平均排序)快速...
    不会code的程序猿阅读 590评论 0 0
  • 算法简介 是一种分治的排序算法,特点就是快,而且效率高。 基本思路 通过一趟排序将待排元素分隔成独立的两部分,其中...
    TinyDolphin阅读 3,527评论 0 3
  • 冒泡排序 冒泡排序相对来说是较为简单的一种排序,它的思想就是在每一次循环中比较相邻的两个数,通过交换的方式,将最小...
    陌上疏影凉阅读 602评论 0 3
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,235评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,747评论 0 15