1. 排序過程
- 首先,堆在數組里是一個完全二叉樹。我們要首先現在數組上建堆。建堆即使對所有的父結點開始向下調整(downAdjust), 這個過程從下面的父節點開始。
- 如此一來便可以得到一個堆,于是確定了這個堆中的最大或者最小元素,可以將其和數組最后一個元素交換,放到數組最后。如此一來,便得到了大小為1的有序數組,為了維護堆的特性,堆頂元素要向下調整(downAdjust).
- 多次如此交換,便可以得到一個有序序列
2. 堆進行元素的添加和刪除
- 刪除堆頂元素,直接把堆頂元素與末尾元素交換,新的堆頂元素然后向下調整(downAdjust)
- 添加, 先把元素添加到隊列末尾,然后向上調整(upAdjust)
3. 相關習題
- leetcode 215. Kth Largest Element in an Array
- 1.題目要求找到第k大的數字,可以先建size = k的最小堆, 然后對剩下的元素進行比較,小于等于堆頂元素的,則不可能是第k大的數,無視。 大于堆頂元素的,先刪除堆頂元素,再加入該元素,調整堆。最后的堆頂元素就是第k大的數。 復雜度: kln(k) + (n-k)ln(k), 第一部分是建堆,第二部分是比較.