java實現最小堆


1.堆:通常通過二叉堆,實為二叉樹的一種,分為最小堆和最大堆,具有以下性質:

  • 任意節點小於它的所有后裔,最小元在堆的根上。
  • 堆總是一棵完全樹

  將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

2.最小堆實現:

  插入:

  1)  將新插入的元素,放置到隊列的尾部。

  2)  若該元素小於其父節點,兩個元素互換。(上移操作)

  3)  迭代,直至該元素沒有父節點或小於其父節點。

  刪除:

  1)  移掉頂部的節點。

  2)  將隊末的元素放置到頂部。

  3)  該節點與其子節點中較小的那個比較,若小於它,則交換位置,(下移操作)

  4)  迭代,直到葉節點或不再比其子節點中較小那個大。

  java code:

 1 package minHeap;
 2 
 3public class MinHeap {
 4     private int[] data;
 5 
 6     public MinHeap(int[] data) {
 7         this.data = data;
 8     }
 9 
10     public void createHeap() {
11         for (int i = (data.length) / 2 - 1; i >= 0; i--) {
12             heapIfy(i);
13         }
14     }
15 
16     public void heapIfy(int value) {
17         int lchild = left(value);
18         int rchild = right(value);
19         int smallest = value;
20         if (lchild < data.length && data[lchild] < data[value])
21             smallest = lchild;
22         if (rchild < data.length && data[rchild] < data[smallest])
23             smallest = rchild;
24         if (value == smallest)
25             return;
26         swap(value, smallest);
27         heapIfy(smallest);
28     }
29 
30     public int left(int value) {
31         return ((value + 1) << 1) - 1;
32     }
33 
34     public int right(int value) {
35         return (value + 1) << 1;
36     }
37 
38     public void swap(int i, int j) {
39         int tmp = data[i];
40         data[i] = data[j];
41         data[j] = tmp;
42     }
43 
44     public void setRoot(int value) {
45         data[0] = value;
46         heapIfy(0);
47     }
48 
49     public static void main(String[] args) {
50         int[] value = { 10, 100, 12, 73, 45, 32, 11, 23, 55, 34, 90, 21 };
51         MinHeap heap = new MinHeap(value);
52         heap.createHeap();
53         for (int i = 0; i < value.length; i++) {
54             System.out.print(heap.data[i] + " ");
55         }
56         System.out.println();
57         heap.setRoot(64);
58         for (int i = 0; i < value.length; i++) {
59             System.out.print(heap.data[i] + " ");
60         }
61         System.out.println();
62     }
63 }

   

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM