首页 > 其他 > 详细

数据结构之堆

时间:2021-05-03 00:27:28      阅读:29      评论:0      收藏:0      [点我收藏+]

1.堆的构建(大根堆):

package com.hfm.util;

import java.util.Arrays;

public class Heap {
    int arr[];

    public Heap(int[] arr) {
        this.arr = arr;
        print(arr);
        build(arr,arr.length-1,arr.length-1);
        System.out.println();
        print(arr);
    }

    private int getHeight(int arr[]){
        return (int)Math.ceil(Math.log(1+arr.length)/Math.log(2));
    }

    private static void print(int arr[]){
        int height = 0,count = 0;
        while(count<arr.length){
            int num = ((int) Math.pow(2, height));
            for(int i=0;i<num&&(count<arr.length);i++){
                System.out.print(arr[count]+"\t");
                count ++;
            }
            height++;
            System.out.println();
        }
    }

    private void swap(int arr[],int x,int y){
        arr[x] += arr[y];
        arr[y] = arr[x] - arr[y];
        arr[x] = arr[x] - arr[y];
    }

    private void build(int arr[],int curNotLeaf,int visited){ // 大根堆的构建
        if(visited==0)
            return;
        int parent = ((int) Math.ceil(curNotLeaf / 2.0))-1>-1? ((int) Math.ceil(curNotLeaf / 2.0))-1:0,last = 0;
        while (parent>-1){
            if(arr[curNotLeaf]>arr[parent]){
                swap(arr,curNotLeaf,parent);
                last = parent;
                curNotLeaf = parent;
                parent = ((int) Math.ceil(parent / 2.0))-1>-1? ((int) Math.ceil(parent / 2.0))-1:0;
                continue;
            }
            break;
        }
        //交换叶子节点最大值和当前值
        int res[] = null;
        while((res = maxLeaf(arr,last))[0]!=-Integer.MAX_VALUE){
            if(res[0] != -Integer.MAX_VALUE){
                if(arr[last]<arr[res[1]]){
                    swap(arr,res[1],last);
                }
                last = res[1];
            }
        }
        build(arr,--visited, visited);
    }

    private int[] maxLeaf(int arr[],int index){
        if(index*2+1>arr.length-1)
            return new int[]{-Integer.MAX_VALUE,-Integer.MAX_VALUE};
        if(index*2+2>arr.length-1)
            return new int[]{arr[index*2+1],index*2+1};
        else
            return arr[index*2+1]>=arr[index*2+2]?new int[]{arr[index*2+1],index*2+1}:new int[]{arr[index*2+2],index*2+2};
    }
    public static void main(String[] args) {
        Heap heap = new Heap(new int[]{5,8,13,2,7,12,15,2});
    }
}

 

数据结构之堆

原文:https://www.cnblogs.com/g177w/p/14726537.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!