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
具體細節下一博客講