今天我们来讲一下堆,堆排序最重要的就是堆排序了,堆排序是一种原地排序,时间复杂度是O(nlogn)的排序算法,
前面我们讲的快速排序算法,平均情况下,时间复杂度为O(nlogn),尽管2个排序算法的时间复杂度相等,那位什么快排的性能比堆排序好呢?带着这个问题我来学习下堆排序
1>如何理解堆这个数据结构?
堆这种数据结构必须满足2个要求
1》必须是完全二叉树
2》堆中的每个节点的值都必须大于等于(小于等于)其子树中每个节点的值.
解释:堆必须是一个完全二叉树,,除了最后一层,其他节点的个数都是满的,最后一层都靠左排列
堆中的每个节点都必须大于等于或者小于等于左右子树的节点的值,大于等于的叫大顶堆,小于等于的叫小顶堆,定义已经清楚,我们来看看下面的图
解释:图中求1,2,3是完全的二叉树,4不是,因为4中最后一层是靠右排列的,1,2数据大顶堆,每个节点的值都是大于等于左右子树的值,3是小顶堆,每个节点的值都是小于等于左右子树的值
图4不是完全二叉树,因为在最后一层是靠右排列的,特浪费基于数据存储的存储空间
2》如何实现一个堆