最小堆

  前几天写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

  

posted on 2016-01-26 15:01  BruceLv  阅读(302)  评论(0编辑  收藏  举报

导航