堆排序的细节和复杂度分析(非常重要,一定要会)
1.时间复杂度O(NlogN),额外空间复杂度O(1)
2.二叉树:
(1)完全二叉树:要么是一棵满二叉树(满二叉树属于完全二叉树);如果不是满二叉树,那么这棵树应该是从左往右依次补齐的。
(2)通过数组来理解完全二叉树,对于节点i,在不越界的情况下左孩子的下标是2i+1,右孩子下标是2*i+2,如果数组越界了,那就说明右孩子不存在。对于节点i,它的的父节点的下标是(i-1)/2。0的父节点是自己。
3.大根堆(堆就是一棵完全二叉树),即在一棵完全二叉树中,任何一棵子树的最大值都是这课子树的头部,小根堆同理,任何一棵子树的最小值都是这课子树的头部,对于任何一棵子树都是这样的。建立大根堆的时间复杂度是O(N),heapinsert的调整,经历一个新节点加入到这棵树种,同时向上调整的过程。对于i号节点加入进来调整的代价是O(log(i-1)),第i+1个节点加入进来调整的代价是O(log(i)),对于n个节点的调整代价是log1+log2+log3+......+log(n-1),这是整个数组所有节点加进来变成完全二叉树的时间复杂度O(N),再重复一遍,建立大根堆的时间复杂度是O(N)。把节点加入到堆的最后一个位置,然后将节点向上调整的过程。
4.堆结构非常重要:堆可以搞定几乎所有的贪心算法。
5.堆排序非常重要
(1)堆排序heap insert与heapify。
(2)堆结构的增大与减少。
(3)如果只是建立堆得过程,时间复杂度为O(N)。
(4)优先级队列结构,就是堆结构。
6.数组堆排序的过程:
(1)让数组变成大根堆,然后将堆顶元素弹出,调整堆,继续之前操作。
6.举例:
对于数组 :2 1 3 6 0 4
具体细节下一博客讲