本文介绍了一种使用Java语言实现的最大堆数据结构。该结构采用数组形式存储,支持插入、获取最大值及删除最大值等基本操作,并通过向上调整和向下调整确保堆性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 堆介绍

堆是一棵根最大(最小)的完全二叉树 
本示例用数组存储一棵最大堆,Java语言实现

2 实现

/**
 * Java实现最大堆
 * @author xld
 *
 */
public class MaxHeap {
    private int[] data;
    private int count;
    private int capacity;

    //构造函数 
    public MaxHeap(int capacity){
        this.data=new int[capacity+1];
        this.count=0;
        this.capacity=capacity;
    }

    //判断堆是否为空 
    public boolean isEmpty(){
        return count==0;
    }

    //返回堆的长度 
    public int size(){
        return count;
    }

    //添加数据 
    public void insert(int val){
        assert count+1<capacity;
        data[count+1]=val;
        count++;
        shiftUp(count);
    }

    // 从最大堆中取出堆顶元素, 即堆中所存储的最大数据
    public int extractMax(){
        assert count>0;
        int ret = data[1];
        swap(data,1,count);
        shiftDown(1);
        return ret;
    }

    // 获取最大堆中的堆顶元素
    public int getMax(){
        assert(count>0);
        return data[1];
    }

    /**
     * 辅助函数
     */
    public void shiftUp(int k){
        while(k>1 &&data[k]>data[k/2]){
            swap(data,k,k/2);
            k/=2;
        }
    }

    public static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    /**
     * 将元素向下移动
     * @param k
     */
    public void shiftDown(int k){
        while(2*k<count){
            int j=2*k;
            //在次轮循环中,交换data[k]和data[j]的位置 
            if(j+1<count && data[j+1]>data[j])
                j++;
            //data[j]为k子节点的最大值 
            if(data[k]>data[j])
                break;
            swap(data,k,j);
            k=j;
        }
    }
    public static void main(String[] args) {
        MaxHeap heap = new MaxHeap(10);
        for(int i=0;i<10;i++){
            heap.insert(i+1);
        }
        System.out.println(heap.getMax());

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值