zoukankan      html  css  js  c++  java
  • 最小堆

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

      

  • 相关阅读:
    1.4redis小结--队列在抢购活动的实现思路
    1.3redis小结--配置php reids拓展
    redis小结 1-2
    redis小结 1-1
    pandas学习小记
    Python简单算法的实现
    python编码
    ThinkPHP中的__initialize()和类的构造函数__construct()
    js正则常用方法
    总结了下PHPExcel官方读取的几个例子
  • 原文地址:https://www.cnblogs.com/nocml/p/5160440.html
Copyright © 2011-2022 走看看