前几天写dijkstra算法,想到了最小堆。今天整理了一下。发了出来。还是本着说明天的原则。代码没有进行压缩。
最小堆:
1、用数组表示时,假设当前根节点的下标为i , 则其两个子节点的下标分别为 2*i + 1 与 2*i + 2
2、最小堆的根节点的值小于其子节点的值,且其子节点与其对应的子孙节点也是最小堆。
package minheap; public class MinHeap { public static void insert(int [] a , int value){ //如果value小于等于堆中的最小值,则直接返回,不做任何操作。 if(a[0] >= value) return ; else{ //初始化 int p = 0 ; //根结点 //把新值赋给a[0] a[0] = value; //用新值与数组中原来存在的值一一比较 while(p < a.length){ int q = 2*p + 1; if(q >= a.length) return; //选出两个字节点较小的那个节点 if (q < a.length - 1 && a[q + 1] < a[q]) q = q + 1; //如果根节点小于较小的子节点,则交换数据,且根节点置为此时的子节点 if (a[q] < a[p]) { int t = a[p]; a[p] = a[q]; a[q] = t; p = q; } else break; } } } public static void main(String[] args) { int [] a = new int [10]; for(int i = 89 ; i < 100 ; i++){ insert(a , i); print(a); } } public static void print(int a []){ for(int i = 0 ; i < a.length ; i++) System.out.print(a[i]+" "); System.out.println(); } }
运行结果:
0 0 0 0 0 0 0 89 0 0
0 0 0 0 0 0 0 89 90 0
0 0 0 89 0 0 0 91 90 0
0 0 0 89 0 0 0 91 90 92
0 0 0 89 92 0 0 91 90 93
0 89 0 90 92 0 0 91 94 93
0 89 0 90 92 95 0 91 94 93
0 89 0 90 92 95 96 91 94 93
0 89 95 90 92 97 96 91 94 93
89 90 95 91 92 97 96 98 94 93
90 91 95 94 92 97 96 98 99 93