而爲了維護堆的徹底性,就決定了堆插入結點時只有兩種狀況:html
1.h層的左邊下一個位置。
2.h+1層的第一個位置。(h層爲滿)git
BinaryTreeNode類
,而且添加雙親指針和對應的set方法。有一個實例數據lastNode
做用是跟蹤記錄堆中的最後一個葉子,也就是指向末結點的引用。
算法
lastNode
指針從新設定爲指向新的最末結點。addElement
操做的複雜度爲2 * logn + 1 + logn,爲O(logn)。removeMin
操做的複雜度爲2 * logn + logn + 1,爲O(logn)。根據書P268 和 P270,api
由於數組不須要肯定新結點雙親的步驟,以及數組不須要肯定新的最末結點。因此,雖然他的時間複雜度和用鏈表實現時是同樣的,可是數組實現的效率更高一些。數組
首先,要清楚堆排序的思想,堆排序是一種選擇排序 。如何將一個雜亂排序的堆從新構形成最大堆,它的主要思路就是數據結構
從上往下,將父節點與子節點以此比較。若是父節點最大則進行下一步循環,若是子節點更大,則將子節點與父節點位置互換,並進行下一步循環。注意父節點要與兩個子節點都進行比較。學習
咱們第一步就應該明白,如何將一個無序列表構建成最大堆。優化
從最後一個非葉節點開始調整。.net
如圖,這裏的最後一個非葉子結點是結點4,那麼咱們就從這裏進行調整。設計
每次調整都是從父節點、左孩子節點、右孩子節點三者中選擇最大者跟父節點進行交換(交換以後可能形成被交換的孩子節點不知足堆的性質,所以每次交換以後要從新對被交換的孩子節點進行調整)。
如圖,發現,我插入隊列的依次是,2,10,3。而後中序遍歷就是10,2,3。這是沒有問題的,可是刪除以後,雖然2刪除掉了,可是多了一個3。
dequeue()
方法,調用了以前父類ArrayHeap
類中removeMin()
方法所引發的。CompareTo
方法的斷定條件不一樣。隊列只須要將進入堆的順序記錄下來就能夠而後比較便可。那麼這裏的調用的removeMin()
方法實際上就是刪除隊列中順序最低的,也就是第一個進來的元素。public T removeMin() throws EmptyCollectionException { if (isEmpty()) throw new EmptyCollectionException("ArrayHeap"); T minElement = tree[0]; tree[0] = tree[count-1]; heapifyRemove(); count--; modCount--; return minElement; }
tree[count] =null;就能夠解決問題了。
堆是基於二叉樹的。這周看代碼的效率並非很高,對於代碼的理解也不是很深刻。歸結於學習積極性不高。凡事不要鑽牛角尖,過去的就過去了,一切都會好起來。不要給本身額外的壓力和負擔。
看過別的同窗優秀的博客之後發現本身不能懈怠。好比不少同窗都聯繫到了上學期的堆棧內存時的學習內容。學習應該有體系,不可以東拼西揍,撿西瓜丟芝麻。仍是要踏實下來,戒驕戒躁。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 10/10 | |
第二週 | 610/610 | 1/2 | 20/30 | |
第三週 | 593/1230 | 1/3 | 18/48 | |
第四周 | 2011/3241 | 2/5 | 30/78 | |
第五週 | 956/4197 | 1/6 | 22/100 | |
第六週 | 2294/6491 | 2/8 | 20/120 | |
第七週 | 914/7405 | 1/9 | 20/140 | |
第八週 | 2366/9771 | 2/11 | 22/162 |