美文网首页
为什么堆排序比快排慢

为什么堆排序比快排慢

作者: 海角hust | 来源:发表于2020-11-28 21:20 被阅读0次

回顾一下堆排的过程:

  1. 建立最大堆(堆顶的元素大于其两个儿子,两个儿子又分别大于它们各自下属的两个儿子… 以此类推)

  2. 将堆顶的元素和最后一个元素对调(相当于将堆顶元素(最大值)拿走,然后将堆底的那个元素补上它的空缺),然后让那最后一个元素从顶上往下滑到恰当的位置(重新使堆最大化)。

  3. 重复第2步。

这里的关键问题就在于第2步,堆底的元素肯定很小,将它拿到堆顶和原本属于最大元素的两个子节点比较,它比它们大的可能性是微乎其微的。实际上它肯定小于其中的一个儿子。而大于另一个儿子的可能性非常小。于是,这一次比较的结果就是概率不均等的,根据前面的分析,概率不均等的比较是不明智的,因为它并不能保证在糟糕情况下也能将问题的可能性削减到原本的1/2。可以想像一种极端情况,如果a肯定小于b,那么比较a和b就会什么信息也得不到——原本剩下多少可能性还是剩下多少可能性。

在堆排里面有大量这种近乎无效的比较,因为被拿到堆顶的那个元素几乎肯定是很小的,而靠近堆顶的元素又几乎肯定是很大的,将一个很小的数和一个很大的数比较,结果几乎肯定是“小于”的,这就意味着问题的可能性只被排除掉了很小一部分。

这就是为什么堆排比较慢(堆排虽然和快排一样复杂度都是O(NlogN)但堆排复杂度的常系数更大)。
一种Fast-HeapSort:

1、将堆顶的元素拿掉。
2、每次不是将堆底的元素拿到上面去,而是直接比较堆顶(最大)元素的两个儿子,即选出次大的元素,补充到堆顶
3、类似于步骤2,重复利用儿子节点的较大元素补充父亲节点,直至叶节点。

参考:
http://mindhacks.cn/2008/06/13/why-is-quicksort-so-quick/
https://www.zhihu.com/question/20842649
https://blog.csdn.net/tiandawenwu/article/details/17926581

相关文章

  • 为什么堆排序比快排慢

    回顾一下堆排的过程: 建立最大堆(堆顶的元素大于其两个儿子,两个儿子又分别大于它们各自下属的两个儿子… 以此类推)...

  • 2019-10-13 快速排序和堆排序

    1.快速排序双边循环发和单边循环法 2.堆排序 3.快排和堆排序的对比(1)快排的堆排序的时间复杂度都是(nlog...

  • 快排 & 堆排序

    排序 排序一直是很基础的一个问题。 复习快排 &堆排序。 LeetCode215 找第k大的元素 快排 注意事项:...

  • php-归并排序、快速排序、堆排序

    归并排序、快速排序、堆排序 时间复杂度 O(nlogn) 归并排序 快速排序(快排) 堆排序

  • 基本排序算法

    冒泡算法 简单选择排序 堆排序 快排 归并排序

  • FindK、快排、堆排序

    1、快排解法 2、堆排解法

  • 快排,堆排序介绍

    快速排序 首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • 内部排序 - 四种排序总结及比较

    四种排序为 折半插入,希尔排序,快排,堆排序 快排比较重要,前两个学习时候忽略掉了,堆排序以前一直以为比较复杂,现...

  • 土法合唱训练 - 节奏不稳怎么办?

    原则: 快歌慢排,慢歌快排。排练的时候,速度快的曲子要比谱面标记的速度慢, 速度慢的曲子要比谱面标记速度快。 当然...

网友评论

      本文标题:为什么堆排序比快排慢

      本文链接:https://www.haomeiwen.com/subject/iricwktx.html