前几天写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]+"\t");
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