堆排序的细节和复杂度分析(非常重要,一定要会)

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

具体细节下一博客讲

posted @ 2019-03-05 11:05  stone1234567890  阅读(6402)  评论(0编辑  收藏  举报