gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

Java數(shù)據(jù)結構之最小堆和最大堆的原理及實現(xiàn)詳解

本篇文章給大家?guī)砹岁P于java的相關知識,在計算機科學中,堆(heap) 的實現(xiàn)是一種基于樹的特殊的數(shù)據(jù)結構,它可以在數(shù)組上構建出樹的結構體,并滿足堆的屬性,下面就來聊聊Java數(shù)據(jù)結構中的堆,感興趣的可以了解一下。

Java數(shù)據(jù)結構之最小堆和最大堆的原理及實現(xiàn)詳解

java代碼一鍵生成、拖拽設計:立即使用

推薦學習:《java視頻教程》

一、前言

堆的歷史

堆的數(shù)據(jù)結構有很多種體現(xiàn)形式,包括;2-3堆、B堆、斐波那契堆,而在 Java API 中最常用的是用于實現(xiàn)優(yōu)先隊列的二叉堆,它是由 JWJ Williams 在 1964 年引入的,作為堆排序算法的數(shù)據(jù)結構。另外在 Dijkstra 算法等幾種高效的圖算法中,堆也是非常重要的。

二、堆的數(shù)據(jù)結構

在計算機科學中,堆(heap) 的實現(xiàn)是一種基于樹的特殊的數(shù)據(jù)結構,它可以在數(shù)組上構建出樹的結構體,并滿足堆的屬性;

最小堆:如果P 是C 的一個父級節(jié)點, 那么P 的key(或value)應小于或等于C 的對應值。

Java數(shù)據(jù)結構之最小堆和最大堆的原理及實現(xiàn)詳解

最大堆:與最小堆的定義正好相反,最大堆(max heap) ,P 的key(或value)大于C 的對應值。

Java數(shù)據(jù)結構之最小堆和最大堆的原理及實現(xiàn)詳解

三、堆的代碼實現(xiàn)

1. 實現(xiàn)介紹

堆的實現(xiàn)在 Java API 中主要體現(xiàn)在延遲隊列的實現(xiàn)二叉堆上,這里小傅哥單獨把這部分代碼拆分出來,了解下關于小堆和大堆的實現(xiàn)。

從對堆的數(shù)據(jù)結構介紹上可以看到,小堆和大堆的唯一區(qū)別僅是對元素的排序方式不同。所以也就是說在存放和獲取元素的時候對元素的填充和摘除時,排序方式不同而已。

2. 入堆實現(xiàn)

堆的在存放元素時,以遵循它的特點,會在存放過程中,通過隊尾元素向上比對遷移。

private void siftUpComparable(int k, E x) {     logger.info("【入隊】元素:{} 當前隊列:{}", JSON.toJSONString(x), JSON.toJSONString(queue));     while (k > 0) {         // 獲取父節(jié)點Idx,相當于除以2         int parent = (k - 1) >>> 1;         logger.info("【入隊】尋找當前節(jié)點的父節(jié)點位置。k:{} parent:{}", k, parent);         Object e = queue[parent];         // 如果當前位置元素,大于父節(jié)點元素,則退出循環(huán)         if (compareTo(x, (E) e) >= 0) {             logger.info("【入隊】值比對,父節(jié)點:{} 目標節(jié)點:{}", JSON.toJSONString(e), JSON.toJSONString(x));             break;         }         // 相反父節(jié)點位置大于當前位置元素,則進行替換         logger.info("【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:{} 存放到位置:{}", JSON.toJSONString(e), k);         queue[k] = e;         k = parent;     }     queue[k] = x;     logger.info("【入隊】完成 Idx:{} Val:{} rn當前隊列:{} rn", k, JSON.toJSONString(x), JSON.toJSONString(queue)); }

入堆的實現(xiàn) add 方法最終會調用到 siftUpComparable 方法,進行排序的方式進行處理。而這個排序 compareTo 方法是由具體的 MinHeap、MaxHeap 來做實現(xiàn)。

以入堆元素2舉例,如圖所示入堆過程。

Java數(shù)據(jù)結構之最小堆和最大堆的原理及實現(xiàn)詳解

首先將元素2掛到隊列尾部,之后通過 (k – 1) >>> 1 計算父節(jié)點位置,與對應元素進行比對和判斷交換。

交換過程包括 2->6、2->5,以此交換結束后元素保存完畢。

3. 出堆實現(xiàn)

元素的出堆其實很簡單,只要把根元素直接刪除彈出即可。但剩余接下里的步驟才是復雜的,因為需要在根元素遷移走后,尋找另外的最小元素遷移到對頭。這個過程與入堆正好相反,這是一個不斷向下遷移的過程。

private void siftDownComparable(int k, E x) {     // 先找出中間件節(jié)點     int half = size >>> 1;     while (k < half) {         // 找到左子節(jié)點和右子節(jié)點,兩個節(jié)點進行比較,找出最大的值         int child = (k << 1) + 1;         Object c = queue[child];         int right = child + 1;         // 左子節(jié)點與右子節(jié)點比較,取最小的節(jié)點         if (right < size && compareTo((E) c, (E) queue[right]) > 0) {             logger.info("【出隊】左右子節(jié)點比對,獲取最小值。left:{} right:{}", JSON.toJSONString(c), JSON.toJSONString(queue[right]));             c = queue[child = right];         }         // 目標值與c比較,當目標值小于c值,退出循環(huán)。說明此時目標值所在位置適合,遷移完成。         if (compareTo(x, (E) c) <= 0) {             break;         }         // 目標值小于c值,位置替換,繼續(xù)比較         logger.info("【出隊】替換過程,節(jié)點的值比對。上節(jié)點:{} 下節(jié)點:{} 位置替換", JSON.toJSONString(queue[k]), JSON.toJSONString(c));         queue[k] = c;         k = child;     }     // 把目標值放到對應位置     logger.info("【出隊】替換結果,最終更換位置。Idx:{} Val:{}", k, JSON.toJSONString(x));     queue[k] = x; }

不斷地向下遷移元素。這個過程會比對左右子節(jié)點的值,找到最小的。所以整個過程會比入堆麻煩一些。

Java數(shù)據(jù)結構之最小堆和最大堆的原理及實現(xiàn)詳解

這里以彈出元素1舉例,之后將堆尾元素替換到相應的位置。整個過程分為6張圖表述。

  • 圖1到圖2,找出根元素彈出。
  • 圖3到圖4,將根元素向下遷移,與子元素比對,并替換位置。如果這個位置與8相比,小于8則繼續(xù)向下遷移。
  • 圖4到圖5,繼續(xù)遷移,在原節(jié)點4的位置對應的兩個子元素,都比8大,這個時候就可以停下來了。
  • 圖5到圖6,更換元素位置,把隊尾的元素替換到對應元素1向下遷移檢測的位置。

4. 小堆實現(xiàn)

小堆是一個正序比對

public class MinHeap extends Heap<Integer> {      @Override     public int compareTo(Integer firstElement, Integer secondElement) {         return firstElement.compareTo(secondElement);     }  }

測試

@Test public void test_min_heap() {     MinHeap heap = new MinHeap();     // 存入元素     heap.add(1);     heap.add(3);     heap.add(5);     heap.add(11);     heap.add(4);     heap.add(6);     heap.add(7);     heap.add(12);     heap.add(15);     heap.add(10);     heap.add(9);     heap.add(8);     // 彈出元素     while (heap.peek() != null){         logger.info("測試結果:{}", heap.poll());     } }

結果

17:21:30.053 [main] INFO queue.PriorityQueue – 【入隊】元素:3 當前隊列:[1,null,null,null,null,null,null,null,null,null,null]
17:21:30.055 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:1 parent:0
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:1 目標節(jié)點:3
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:1 Val:3
當前隊列:[1,3,null,null,null,null,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】元素:5 當前隊列:[1,3,null,null,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:2 parent:0
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:1 目標節(jié)點:5
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:2 Val:5
當前隊列:[1,3,5,null,null,null,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】元素:11 當前隊列:[1,3,5,null,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:3 parent:1
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:3 目標節(jié)點:11
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:3 Val:11
當前隊列:[1,3,5,11,null,null,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】元素:4 當前隊列:[1,3,5,11,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:4 parent:1
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:3 目標節(jié)點:4
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:4 Val:4
當前隊列:[1,3,5,11,4,null,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】元素:6 當前隊列:[1,3,5,11,4,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:5 parent:2
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:5 目標節(jié)點:6
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:5 Val:6
當前隊列:[1,3,5,11,4,6,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】元素:7 當前隊列:[1,3,5,11,4,6,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:6 parent:2
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:5 目標節(jié)點:7
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:6 Val:7
當前隊列:[1,3,5,11,4,6,7,null,null,null,null] 17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】元素:12 當前隊列:[1,3,5,11,4,6,7,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:7 parent:3
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:11 目標節(jié)點:12
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:7 Val:12
當前隊列:[1,3,5,11,4,6,7,12,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】元素:15 當前隊列:[1,3,5,11,4,6,7,12,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:8 parent:3
17:21:30.056 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:11 目標節(jié)點:15
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:8 Val:15
當前隊列:[1,3,5,11,4,6,7,12,15,null,null]

17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】元素:10 當前隊列:[1,3,5,11,4,6,7,12,15,null,null]
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:9 parent:4
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:4 目標節(jié)點:10
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:9 Val:10
當前隊列:[1,3,5,11,4,6,7,12,15,10,null]

17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】元素:9 當前隊列:[1,3,5,11,4,6,7,12,15,10,null]
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:10 parent:4
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:4 目標節(jié)點:9
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:10 Val:9
當前隊列:[1,3,5,11,4,6,7,12,15,10,9]

17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】元素:8 當前隊列:[1,3,5,11,4,6,7,12,15,10,9,null,null,null,null,null,null,null,null,null,null,null,null,null]
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:11 parent:5
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:6 目標節(jié)點:8
17:21:30.057 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:11 Val:8
當前隊列:[1,3,5,11,4,6,7,12,15,10,9,8,null,null,null,null,null,null,null,null,null,null,null,null]

17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:1 下節(jié)點:3 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:11 right:4
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:3 下節(jié)點:4 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:10 right:9
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:4 Val:8
17:21:30.057 [main] INFO heap.__test__.HeapTest – 測試結果:1
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:3 下節(jié)點:4 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:11 right:8
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:4 下節(jié)點:8 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:4 Val:9
17:21:30.057 [main] INFO heap.__test__.HeapTest – 測試結果:3
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:8 right:5
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:4 下節(jié)點:5 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:5 下節(jié)點:6 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:5 Val:10
17:21:30.057 [main] INFO heap.__test__.HeapTest – 測試結果:4
17:21:30.057 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:8 right:6
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:5 下節(jié)點:6 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:10 right:7
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:6 下節(jié)點:7 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:6 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:5
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:8 right:7
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:6 下節(jié)點:7 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:7 下節(jié)點:10 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:5 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:6
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:7 下節(jié)點:8 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:11 right:9
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:8 下節(jié)點:9 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:4 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:7
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:8 下節(jié)點:9 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:9 下節(jié)點:11 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:3 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:8
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:11 right:10
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:9 下節(jié)點:10 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:2 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:9
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:10 下節(jié)點:11 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:1 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:10
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:11 下節(jié)點:12 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:1 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:11
17:21:30.058 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:0 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:12
17:21:30.058 [main] INFO heap.__test__.HeapTest – 測試結果:15

Process finished with exit code 0
小堆就是一個正序的輸出結果,從小到大的排序和輸出。
小堆空間:[1,3,5,11,4,6,7,12,15,10,9,8,null,null,null,null,null,null,null,null,null,null,null,null]

  • 小堆就是一個正序的輸出結果,從小到大的排序和輸出。
  • 小堆空間:[1,3,5,11,4,6,7,12,15,10,9,8,null,null,null,null,null,null,null,null,null,null,null,null]

5. 大堆實現(xiàn)

小堆是一個反序比對

public class MaxHeap extends Heap<Integer> {      @Override     public int compareTo(Integer firstElement, Integer secondElement) {         return secondElement.compareTo(firstElement);     }  }

測試

@Test public void test_max_heap() {     MaxHeap heap = new MaxHeap();     // 存入元素     heap.add(1);     heap.add(3);     heap.add(5);     heap.add(11);     heap.add(4);     heap.add(6);     heap.add(7);     heap.add(12);     heap.add(15);     heap.add(10);     heap.add(9);     heap.add(8);     // 彈出元素     while (heap.peek() != null){         logger.info("測試結果:{}", heap.poll());     } }

結果

17:23:45.079 [main] INFO queue.PriorityQueue – 【入隊】元素:3 當前隊列:[1,null,null,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:1 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:1 存放到位置:1
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:0 Val:3
當前隊列:[3,1,null,null,null,null,null,null,null,null,null]

17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】元素:5 當前隊列:[3,1,null,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:2 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:3 存放到位置:2
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:0 Val:5
當前隊列:[5,1,3,null,null,null,null,null,null,null,null]

17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】元素:11 當前隊列:[5,1,3,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:3 parent:1
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:1 存放到位置:3
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:1 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:5 存放到位置:1
17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:0 Val:11
當前隊列:[11,5,3,1,null,null,null,null,null,null,null]

17:23:45.081 [main] INFO queue.PriorityQueue – 【入隊】元素:4 當前隊列:[11,5,3,1,null,null,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:4 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:5 目標節(jié)點:4
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:4 Val:4
當前隊列:[11,5,3,1,4,null,null,null,null,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】元素:6 當前隊列:[11,5,3,1,4,null,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:5 parent:2
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:3 存放到位置:5
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:2 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:11 目標節(jié)點:6
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:2 Val:6
當前隊列:[11,5,6,1,4,3,null,null,null,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】元素:7 當前隊列:[11,5,6,1,4,3,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:6 parent:2
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:6 存放到位置:6
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:2 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:11 目標節(jié)點:7
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:2 Val:7
當前隊列:[11,5,7,1,4,3,6,null,null,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】元素:12 當前隊列:[11,5,7,1,4,3,6,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:7 parent:3
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:1 存放到位置:7
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:3 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:5 存放到位置:3
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:1 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:11 存放到位置:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:0 Val:12
當前隊列:[12,11,7,5,4,3,6,1,null,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】元素:15 當前隊列:[12,11,7,5,4,3,6,1,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:8 parent:3
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:5 存放到位置:8
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:3 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:11 存放到位置:3
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:1 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:12 存放到位置:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:0 Val:15
當前隊列:[15,12,7,11,4,3,6,1,5,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】元素:10 當前隊列:[15,12,7,11,4,3,6,1,5,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:9 parent:4
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:4 存放到位置:9
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:4 parent:1
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:12 目標節(jié)點:10
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:4 Val:10
當前隊列:[15,12,7,11,10,3,6,1,5,4,null]

17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】元素:9 當前隊列:[15,12,7,11,10,3,6,1,5,4,null]
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:10 parent:4
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:10 目標節(jié)點:9
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:10 Val:9
當前隊列:[15,12,7,11,10,3,6,1,5,4,9]

17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】元素:8 當前隊列:[15,12,7,11,10,3,6,1,5,4,9,null,null,null,null,null,null,null,null,null,null,null,null,null]
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:11 parent:5
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:3 存放到位置:11
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:5 parent:2
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】替換過程,父子節(jié)點位置替換,繼續(xù)循環(huán)。父節(jié)點值:7 存放到位置:5
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】尋找當前節(jié)點的父節(jié)點位置。k:2 parent:0
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】值比對,父節(jié)點:15 目標節(jié)點:8
17:23:45.083 [main] INFO queue.PriorityQueue – 【入隊】完成 Idx:2 Val:8
當前隊列:[15,12,8,11,10,7,6,1,5,4,9,3,null,null,null,null,null,null,null,null,null,null,null,null]

17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:15 下節(jié)點:12 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:12 下節(jié)點:11 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:1 right:5
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:11 下節(jié)點:5 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:8 Val:3
17:23:45.083 [main] INFO heap.__test__.HeapTest – 測試結果:15
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:12 下節(jié)點:11 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:5 right:10
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:11 下節(jié)點:10 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:4 Val:9
17:23:45.083 [main] INFO heap.__test__.HeapTest – 測試結果:12
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:11 下節(jié)點:10 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:5 right:9
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:10 下節(jié)點:9 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:4 Val:4
17:23:45.083 [main] INFO heap.__test__.HeapTest – 測試結果:11
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:10 下節(jié)點:9 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:9 下節(jié)點:5 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:3 Val:3
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:10
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:5 right:8
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:9 下節(jié)點:8 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:8 下節(jié)點:7 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:5 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:9
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:5 right:7
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:8 下節(jié)點:7 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:2 Val:6
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:8
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】左右子節(jié)點比對,獲取最小值。left:5 right:6
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:7 下節(jié)點:6 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:2 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:7
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:6 下節(jié)點:5 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:1 Val:4
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:6
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:5 下節(jié)點:4 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:1 Val:3
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:5
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換過程,節(jié)點的值比對。上節(jié)點:4 下節(jié)點:3 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:1 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:4
17:23:45.084 [main] INFO queue.PriorityQueue – 【出隊】替換結果,最終更換位置。Idx:0 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:3
17:23:45.084 [main] INFO heap.__test__.HeapTest – 測試結果:1

Process finished with exit code 0

大堆就是一個反序的輸出結果,從大到小的排序和輸出。

大堆空間:[15,12,8,11,10,7,6,1,5,4,9,3,null,null,null,null,null,null,null,null,null,null,null,null]

推薦學習:《java視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
91免费黄视频| 久久无码高潮喷水| 奇米影音第四色| 无码精品a∨在线观看中文| 日本成人在线不卡| 超级碰在线观看| 午夜视频在线观| japanese在线播放| 大陆极品少妇内射aaaaaa| 男女爱爱视频网站| 日韩av三级在线| 日本黄色播放器| 色综合av综合无码综合网站| 凹凸国产熟女精品视频| 男人舔女人下面高潮视频| 国内精品国产三级国产aⅴ久| 国产高清www| 性欧美1819| 免费高清一区二区三区| 久激情内射婷内射蜜桃| 五月婷婷深爱五月| 国产美女作爱全过程免费视频| 久久精品午夜福利| 51xx午夜影福利| 黄页免费在线观看视频| 国产一线二线三线在线观看| 97超碰人人爽| 91热这里只有精品| 免费成人进口网站| 无码内射中文字幕岛国片| 99热这里只有精品在线播放| a级网站在线观看| 日韩在线综合网| 亚洲高清在线免费观看| 99久久久精品视频| 天堂中文视频在线| 成年人看的毛片| 男女视频在线观看网站| 久久成人免费观看| 日本一级淫片演员| 老司机午夜av| av在线观看地址| 中文字幕一区二区在线观看视频| 国产免费观看高清视频| 亚洲欧美视频二区| 日本国产在线播放| 懂色av一区二区三区四区五区| 日本日本19xxxⅹhd乱影响| 一区二区三区国产好的精华液| 国产精品无码一区二区在线| 日韩欧美中文视频| 日韩一级免费片| 日本成人在线免费视频| 五月丁香综合缴情六月小说| 欧美xxxxxbbbbb| 一区二区在线免费看| 任你操这里只有精品| 国产精品裸体瑜伽视频| www.欧美激情.com| 国产一二三区av| av在线无限看| 国产喷水theporn| 在线视频日韩一区| 午夜激情av在线| 国产精品久久久毛片| 国产高潮免费视频| 在线免费视频一区| 五月婷婷丁香色| 国产又黄又猛又粗| 色婷婷成人在线| 91福利免费观看| 欧美国产视频一区| 欧美亚洲黄色片| 国产精品久久久久9999爆乳| 中文字幕在线中文| 精品少妇人妻av免费久久洗澡| 国产精品www在线观看| 无码粉嫩虎白一线天在线观看 | 日本福利视频导航| 中文字幕一区二区三区四| 日韩欧美理论片| 无码人妻精品一区二区蜜桃网站| 亚洲色欲久久久综合网东京热| 东北少妇不带套对白| 欧美日韩黄色一级片| 天堂在线资源视频| 日本高清免费在线视频| 国产a级黄色大片| 欧美日韩在线一| 三上悠亚av一区二区三区| 三级黄色片免费看| 阿v天堂2017| 日本久久久久久久久久久久| 精品国产无码在线| 亚洲 欧美 日韩 国产综合 在线| 一本久道综合色婷婷五月| 男生操女生视频在线观看 | 毛毛毛毛毛毛毛片123| 精品一区二区三区无码视频| 性一交一乱一伧国产女士spa| aⅴ在线免费观看| 色香蕉在线观看| 麻豆传传媒久久久爱| 亚洲精品天堂成人片av在线播放| 波多野结衣家庭教师在线| 冲田杏梨av在线| 蜜桃视频一区二区在线观看| 国产九九在线视频| 国产乱子伦农村叉叉叉| 国产女同无遮挡互慰高潮91| 性欧美大战久久久久久久| 日本熟妇人妻xxxxx| www插插插无码免费视频网站| 中文字幕天天干| 熟女人妇 成熟妇女系列视频| 热久久最新地址| 久久久久xxxx| 国产aaaaa毛片| 国产在线青青草| 欧美一区二区视频在线播放| 色中文字幕在线观看| www.这里只有精品| 污污视频网站免费观看| 阿v天堂2017| 国产精品裸体瑜伽视频| 日本福利视频在线观看| 交换做爰国语对白| 免费黄频在线观看| 欧美日韩在线成人| www.欧美日本| 日本中文字幕高清| 亚洲精品久久久中文字幕| 久久婷婷综合色| 亚洲不卡视频在线| 色婷婷成人在线| 色一情一区二区| 91香蕉视频免费看| 黑人巨茎大战欧美白妇| 欧美大黑帍在线播放| 鲁一鲁一鲁一鲁一色| 免费在线激情视频| av五月天在线| 亚洲妇熟xx妇色黄蜜桃| 手机成人av在线| 黄色一级大片免费| 鲁一鲁一鲁一鲁一澡| 999精品网站| 特级黄色片视频| 97超碰在线人人| 国产自偷自偷免费一区| 手机视频在线观看| 真人做人试看60分钟免费| 欧美人成在线观看| 免费看污污网站| 国产成人免费高清视频| 欧洲黄色一级视频| 成人性生交免费看| 欧美另类videosbestsex日本| 亚洲美免无码中文字幕在线| 黄色国产小视频| 欧美交换配乱吟粗大25p| 92看片淫黄大片一级| 国产aⅴ爽av久久久久| 97久久国产亚洲精品超碰热| 午夜精品久久久久久久无码| 一路向西2在线观看| 嫩草影院中文字幕| 欧美午夜性生活| 青青在线免费观看| 国产乱女淫av麻豆国产| 欧美在线一区视频| 欧美日韩在线免费观看视频| 少妇高潮毛片色欲ava片| 一本岛在线视频| 干日本少妇首页| 无码人妻精品一区二区蜜桃百度| 色一情一乱一伦一区二区三区日本| 天天操天天干天天玩| 日本熟妇人妻中出| 国产免费黄色av| 伊人久久在线观看| 亚洲综合在线一区二区| 91日韩视频在线观看| 久久成人免费观看| 人体内射精一区二区三区| 久久免费视频2| 麻豆三级在线观看| 91在线视频观看免费| 好吊妞无缓冲视频观看| 可以看毛片的网址| 4444亚洲人成无码网在线观看| 在线观看国产中文字幕| 日本美女高潮视频| 91视频免费版污| 日韩av片网站| 欧美三级午夜理伦三级| 日韩网址在线观看| 欧美 丝袜 自拍 制服 另类| 国产夫妻自拍一区| 国产青青在线视频|