为什么快排比堆排快
来源:互联网 发布:软件程序员 编辑:程序博客网 时间:2024/04/26 12:40
堆排过程(大顶堆)
建立最大堆(堆顶的元素大于其两个儿子,两个儿子又分别大于它们各自下属的两个儿子… 以此类推)
将堆顶的元素和最后一个元素对调(相当于将堆顶元素(最大值)拿走,然后将堆底的那个元素补上它的空缺),然后让那最后一个元素从顶上往下滑到恰当的位置(重新使堆最大化)。
重复第2步。
这里的关键问题就在于第2步,堆底的元素肯定很小,将它拿到堆顶和原本属于最大元素的两个子节点比较,它比它们大的可能性是微乎其微的。实际上它肯定小于其中的一个儿子。而大于另一个儿子的可能性非常小。于是,这一次比较的结果就是概率不均等的。根据信息论中熵的概念及大数定理原理:概率不均等的比较是不明智的,因为它并不能保证在糟糕情况下也能将问题的可能性削减到原本的1/2。可以想像一种极端情况,如果a肯定小于b,那么比较a和b就会什么信息也得不到——原本剩下多少可能性还是剩下多少可能性。
在堆排里面有大量这种近乎无效的比较,因为被拿到堆顶的那个元素几乎肯定是很小的,而靠近堆顶的元素又几乎肯定是很大的,将一个很小的数和一个很大的数比较,结果几乎肯定是“小于”的,这就意味着问题的可能性只被排除掉了很小一部分。
这就是为什么堆排比较慢(堆排虽然和快排一样复杂度都是O(NlogN)但堆排复杂度的常系数更大)。
一种Fast-HeapSort:
1、将堆顶的元素拿掉。
2、每次不是将堆底的元素拿到上面去,而是直接比较堆顶(最大)元素的两个儿子,即选出次大的元素,补充到堆顶
3、类似于步骤2,重复利用儿子节点的较大元素补充父亲节点,直至叶节点。
0 0
- 为什么快排比堆排快
- 为什么快排比堆排快
- 为什么堆排比快排慢
- 堆排序与快排比较
- 快排为什么那样快
- 快排为什么那样快
- 快排为什么那样快
- 快排为什么那样快
- 快排为什么那么快
- epoll为什么这么快
- epoll为什么这么快
- epoll为什么这么快
- epoll为什么这么快
- epoll为什么这么快
- epoll为什么这么快
- epoll为什么这么快?
- hash_strmap 为什么那么快
- DSP为什么快?
- HDU 1203 I NEED A OFFER! (背包)
- Spring中jdbcTemplate的用法实例
- vijos P1443 银河英雄传说
- React-BootStrap框架快速体验上手
- 操作系统内存管理
- 为什么快排比堆排快
- (复习)图论--最短路--Dijkstra算法
- 安卓(Android) 自定义控件 导航栏(TopBar) 适合新手哦
- Android app重构:mvp和mvvm
- KMP算法
- [LeetCode]--47. Permutations II
- 记自己一次严重代码疏忽(ajax的responseText不能比较的问题)
- HDU 5805 NanoApe Loves Sequence(思维)
- Java 基础 之 整型比较