• 最小堆


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

      

  • 相关阅读:
    spring boot , spring security 安全的认证
    C# 插件编写
    linux diff命令详解 和 patch命令
    nginx location 匹配规则
    LVM扩容报错以及 xfs_growfs 和 resize2fs 区别
    shell ps命令 以及 ps命令 进程时间 格式转换
    shell ls 命令
    Ajax类库需要注意的问题
    JS中的基本运动逻辑思想总结
    Ajax读取文件时出现的缓存问题
  • 原文地址:https://www.cnblogs.com/nocml/p/5160440.html
Copyright © 2020-2023  润新知