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 }

   

 

 

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。