用java实现堆

简介: 用java实现堆

以下是使用Java实现堆的示例代码:

public class Heap {
   
    private int[] heapArray;
    private int maxSize;
    private int currentSize;

    public Heap(int maxSize) {
   
        this.maxSize = maxSize;
        this.currentSize = 0;
        heapArray = new int[maxSize];
    }

    public boolean isEmpty() {
   
        return currentSize == 0;
    }

    public boolean isFull() {
   
        return currentSize == maxSize;
    }

    public void insert(int value) {
   
        if (isFull()) {
   
            System.out.println("Heap is full. Cannot insert more elements.");
            return;
        }

        heapArray[currentSize] = value;
        trickleUp(currentSize);
        currentSize++;
    }

    private void trickleUp(int index) {
   
        int parentIndex = (index - 1) / 2;
        int bottom = heapArray[index];

        while (index > 0 && heapArray[parentIndex] < bottom) {
   
            heapArray[index] = heapArray[parentIndex];
            index = parentIndex;
            parentIndex = (index - 1) / 2;
        }

        heapArray[index] = bottom;
    }

    public int remove() {
   
        if (isEmpty()) {
   
            throw new IllegalStateException("Heap is empty. Cannot remove elements.");
        }

        int root = heapArray[0];
        heapArray[0] = heapArray[currentSize - 1];
        currentSize--;

        trickleDown(0);

        return root;
    }

    private void trickleDown(int index) {
   
        int top = heapArray[index];
        int largerChildIndex;

        while (index < currentSize / 2) {
   
            int leftChildIndex = 2 * index + 1;
            int rightChildIndex = 2 * index + 2;

            if (rightChildIndex < currentSize && heapArray[leftChildIndex] < heapArray[rightChildIndex]) {
   
                largerChildIndex = rightChildIndex;
            } else {
   
                largerChildIndex = leftChildIndex;
            }

            if (top >= heapArray[largerChildIndex]) {
   
                break;
            }

            heapArray[index] = heapArray[largerChildIndex];
            index = largerChildIndex;
        }

        heapArray[index] = top;
    }

    public void display() {
   
        for (int i = 0; i < currentSize; i++) {
   
            System.out.print(heapArray[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
   
        Heap heap = new Heap(10);
        heap.insert(4);
        heap.insert(10);
        heap.insert(8);
        heap.insert(15);
        heap.insert(6);
        heap.insert(12);

        heap.display();  // 输出:15 10 12 4 6 8

        heap.remove();
        heap.display();  // 输出:12 10 8 4 6
    }
}

这个示例中,我们定义了一个Heap类来表示堆。堆的大小由maxSize指定,当前堆中的元素个数由currentSize指定。我们使用一个整型数组heapArray来存储堆中的元素。插入操作使用trickleUp方法向上调整堆,从而保持堆的属性。删除操作使用trickleDown方法向下调整堆,从而维护堆的属性。

在main方法中,我们创建了一个堆对象,插入了一些元素,并展示了堆的状态。然后,我们从堆中移除一个元素,并再次展示了堆的状态。

希望这个示例对你有帮助!

相关文章
|
3月前
|
Java
【Java基础面试三十二】、new String(“abc“) 是去了哪里,仅仅是在堆里面吗?
这篇文章解释了Java中使用`new String("abc")`时,JVM会将字符串直接量"abc"存入常量池,并在堆内存中创建一个新的String对象,该对象会指向常量池中的字符串直接量。
|
3月前
|
存储 算法 Java
惊!Java程序员必看:JVM调优揭秘,堆溢出、栈溢出如何巧妙化解?
【8月更文挑战第29天】在Java领域,JVM是代码运行的基础,但需适当调优以发挥最佳性能。本文探讨了JVM中常见的堆溢出和栈溢出问题及其解决方法。堆溢出发生在堆空间不足时,可通过增加堆空间、优化代码及释放对象解决;栈溢出则因递归调用过深或线程过多引起,调整栈大小、优化算法和使用线程池可有效应对。通过合理配置和调优JVM,可确保Java应用稳定高效运行。
132 4
|
1天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
3月前
|
存储 算法 Java
解释 Java 堆空间和垃圾收集
【8月更文挑战第22天】
34 0
|
19天前
|
存储 算法 Java
🏗️Java零基础:深入了解Java 堆
【10月更文挑战第2天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
19 3
|
2月前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
112 2
|
21天前
|
存储 算法 Java
【用Java学习数据结构系列】用堆实现优先级队列
【用Java学习数据结构系列】用堆实现优先级队列
28 0
|
3月前
|
存储 Java 程序员
Java 中的堆栈和堆有什么区别?
【8月更文挑战第22天】
169 0
|
4月前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
66 10
|
4月前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之使用ODPS Tunnel Upload功能时,遇到报错:Java 堆内存不足,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。