堆 |
3.最小堆將其最小的元素儲存在該二叉樹的根處,且其根的兩個孩子也一樣是最小堆
4.addElement操做
將元素添加爲新的葉結點,同時保持樹是徹底樹,將該元素向根的地方移動,將它與父結點對換,直到其中的元素大小關係知足要求爲止。html
5.removeMin操做
利用最後的葉結點來取代根,而後將其向下移動到合適的位置。node
6.findMin操做
此操做較簡單,由於在添加元素的過程當中就已經把最小元素移動到了根位置。git
7.堆和二叉排序樹的區別:api
堆的實現(以最大堆爲例) |
public interface MaxHeap<T extends Comparable<T>> extends BinaryTree<T> { // Adds the specified object to the heap. public void add (T obj); // Returns a reference to the element with the highest value in the heap. public T getMax (); // Removes and returns the element with the highest value in the heap. public T removeMax (); }
2.在 LinkedMaxHeap 中的 add 方法依賴於HeapNode中的兩個方法:getParentAdd 和 heapifyAdd 方法。
其中 getParentAdd 方法從樹的最後一個結點開始,一個一個檢測,尋找新加入結點的父結點。從樹中開始向上查找,直到發現它是某個結點的左子結點,或是到達根結點時爲止。若是到達根結點,新的父結點是根的左後繼結點。若是沒有到達根結點,則再查找右子結點的最左後繼。刪除的成本。數組
public HeapNode<T> getParentAdd (HeapNode<T> last) { HeapNode<T> result = last; while ((result.parent != null) && (result.parent.left != result)) result = result.parent; if (result.parent != null) if (result.parent.right == null) result = result.parent; else { result = (HeapNode<T>) result.parent.right; while (result.left != null) result = (HeapNode<T>) result.left; } else while (result.left != null) result = (HeapNode<T>) result.left; return result; }
一旦新的葉結點添加到樹中,heapifyAdd 方法就利用 parent 引用沿樹向上移動,必要時交換元素。(交換的是元素,不是結點)數據結構
public void heapifyAdd (HeapNode<T> last) { T temp; HeapNode<T> current = last; while ((current.parent != null) && ((current.element).compareTo(current.parent.element) > 0)) { temp = current.element; current.element = current.parent.element; current.parent.element = temp; current = current.parent; } }
堆排序 |
優先隊列 |
從最後一個非葉子結點開始(葉結點不用調整,第一個非葉子結點 arr.length/2-1=5/2-1=1,也就是下面的6結點),從左至右,從下至上進行調整:
ide
找到第二歌非頁結點4,因爲[四、九、8]中9最大,4和9交換/
學習
這時,交換致使了子根[4,5,6]結構混亂,繼續調整,[4,5,6]中6最大,交換4和6。
.net
這樣大頂堆就完成了。
【步驟二】將堆頂元素與末尾元素進行交換,使末尾元素最大。而後繼續調整堆,再將堆頂元素與末尾元素交換,獲得第二大元素。首先將堆頂元素9和末尾元素4進行交換:
設計
從新調整結構,使其繼續知足堆定義:
再將堆頂元素8與末尾元素5進行交換,獲得第二大元素8:
【步驟三】如此反覆進行交換、重建、交換。反覆進行此過程,即可獲得有序序列:
因此,基本步驟歸納爲:將無序堆構建成大頂堆或小頂堆,再經過反覆交換堆頂元素和當前末尾元素並調整,最後使整個序列有序。
暫無
分析:在從二叉查找樹中刪除元素時, 另外一個節點必須促進以替換要刪除的節點。
分析:二叉查找樹中最左邊的節點將包含最小元素, 而最右邊的節點將包含最大元素。
分析:樹的用途之一是提供其餘集合的高效的實現。
分析:同錯題2。
分析:同錯題3.
分析:compareTo返回的是-1,0,1。因此爲int值
分析:氣泡和插入排序都具備 o (n) 的時間複雜度,但選擇排序最好狀況爲O(n^2)。
分析:插入排序在實現上,一般採用in-place排序(即只需用到O(1)的額外空間的排序),於是在從後向前掃描過程當中,須要反覆把已排序元素逐步向後挪位,爲最新元素提供插入空間。
正確使用Markdown語法(加1分)
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, (加3分)
代碼調試中的問題和解決過程, 無問題
感想,體會真切的(加1分)
點評認真,能指出博客和代碼中的問題的(加1分)
20172320
基於評分標準,我給以上博客打分:8分。得分狀況以下:
堆基於之前的所實現的,代碼須要補充的很少,因此還好學。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 8/8 | |
第二週 | 1306/1306 | 1/2 | 20/28 | |
第三週 | 1291/2597 | 1/3 | 18/46 | |
第四周 | 4361/6958 | 2/3 | 20/66 | |
第五週 | 1755/8713 | 1/6 | 20/86 | |
第六週 | 3349/12062 | 1/7 | 20/106 | |
第七週 | 3308/15370 | 1/8 | 20/126 | |
第八週 | 4206/19576 | 2/10 | 20/146 |
計劃學習時間:10小時
實際學習時間:8小時
改進狀況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)