相信其它不少同窗都是以小頂堆來介紹這一章內容,因此我將以大頂堆來介紹這章內容。html
操做 | 說明 |
---|---|
addElement() | 將給定元素添加到該堆中去 |
removeMax() | 刪除堆中最大的元素 |
findMax() | 返回一個指向堆中最大元素的引用 |
findMax操做java
findMax操做將返回一個指向該最大堆中最大元素的引用,也就是根結點的引用。因此實現這一操做只需返回儲存在根結點的元素便可。node
關鍵代碼:git
在我看來,這個比較的代碼是重中之重的。數組
public int compareTo(PrioritizedObject obj) { int result; if (priority > obj.getPriority()) result = 1; else if (priority < obj.getPriority()) result = -1; else if (arrivalOrder > obj.getArrivalOrder()) result = 1; else result = -1; return result; }
public class HeapNode<T> extends BinaryTreeNode<T> { public HeapNode<T> parent;//指向雙親的指針。 public HeapNode(T obj) { super(obj); parent = null; } }
咱們還須要一個可以跟蹤該堆最後一片葉子 的指針:數據結構
public HespNode lastNode;函數
排序方法有兩個部分構成:添加列表的每一個元素、一次刪除一個元素。學習
堆排序的時間複雜度爲O(log n).測試
public class test { public static void main(String[] args) { BigArraryHeap<Integer> temp=new BigArraryHeap<Integer>(); int[] list={36,30,18,40,32,45,22,50}; Object[] list2 = new Object[list.length]; //將數組中的元素添加到大頂堆中 for (int i = 0; i < list.length; i++) temp.addElement(list[i]); System.out.println("大頂堆的輸出結果爲:"+ temp); System.out.println(); for(int n = 0; n < list2.length; n++){ list2[n] = temp.removeMax(); String result = ""; for(int a = 0; a <= n; a++){ result += list2[a] + " "; } System.out.println("第" + (n+1) + "次排序:" + temp + " ~ " + result); } System.out.println(); System.out.print("最後排序結果: "); String result = ""; for(int m = 0; m < list.length; m++){ result += list2[m] + " "; } System.out.println(result); } }
問題1:如何理解這段話,該怎樣實現?.net
一般在堆的實現中,咱們會對二叉樹的最後一片葉子進行跟蹤記錄。
問題1解決方案:
就是在對堆進行刪除操做的時候須要將根結點與最後一片葉子結點進行交換位置,因此每一次操做都得更新lastNode結點。
問題2解決方案:書上數組對對進行排序是寫了一個方法,當想要進行排序的時候直接調用這個方法就OK,而咱們選在在測試類裏面直接進行排序,使用最大堆,取出最大堆輸出,而後就能夠直接輸出。
如圖:
問題三:在網上搜尋有關於書上的資料室,出現了這麼一個尷尬場面:
以後我點進去看了一下:
原來是講解了有關:棧內存和堆內存。
講了這麼個些東西,來潦草的總結下:
問題1解決方案:
首先咱們得知道咱們必須運用優先級堆,而且每一次添加元素,優先級都加一(從0開始)。
Object operator= +
轉化爲char
型數據,可是若是直接轉,好比這樣(char)operator
是會拋出CalssCastException
錯誤的!//像這樣: String a = String.valueOf(ope.pop());//ope.pop()出來的是一個Object型數據。 operator = a.charAt(0);
錯題1及緣由:
What type does "compareTo" return? A .int B .String C .boolean D .char錯誤緣由:comparaTo方法返回的是 -1,0,1
而return "a".comparaTo("b")>0
爲false
orture
無
Since a heap is a binary search tree, there is only one correct location for the insertion of a new node, and that is either the next open position from the left at level h or the first position on the left at level h+1 if level h is full. A .True B .Flase錯誤緣由:堆是一棵徹底二叉樹、不是一顆二叉搜索樹。本身瞎了眼!!!!
- 內容很詳細,把堆介紹的很透徹, - 運用豐富的圖片表達思想、好比插入、刪除結點的介紹。 - 提出問題有點少。
這一章比起前面相對比較簡單,但本身不能鬆懈.哎,比較難受的是這兩天的假期都要貢獻給博客了~~~~~o(╥﹏╥)o
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 260/0 | 1/1 | 05/05 | |
第二週 | 300/560 | 1/2 | 13/18 | |
第三週 | 212/772 | 1/4 | 21/39 | |
第四周 | 330/1112 | 2/7 | 21/60 | |
第五週 | 1321/2433 | 1/8 | 30/90 | |
第六週 | 1024/3457 | 1/9 | 20/110 | |
第七週 | 1024/3457 | 1/9 | 20/130 | |
第八週 | 643/4100 | 2/11 | 30/170 |
1.優先隊列
2.堆排序
3.java 各類數據類型之間的轉化
4.java中的棧與堆