用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方法中,我们创建了一个堆对象,插入了一些元素,并展示了堆的状态。然后,我们从堆中移除一个元素,并再次展示了堆的状态。

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

相关文章
|
2月前
|
存储 算法 Java
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
54 1
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
|
4月前
|
存储 Java 编译器
【面试知识】Java内存分配之常量池、堆、栈
【面试知识】Java内存分配之常量池、堆、栈
|
1月前
|
存储 安全 Java
【JVM】Java堆 :深入理解内存中的对象世界
【JVM】Java堆 :深入理解内存中的对象世界
53 0
|
3月前
|
Java 调度
Java优先队列(堆)理解和使用
Java优先队列(堆)理解和使用
45 0
|
3月前
|
Java
小明买了一堆桃子,不知道个数,第一天吃了一半的桃子,还不过瘾,又多吃了一个。以后他每天吃剩下的桃子的一半还多一个,到n天只剩下一个桃子了。问:最开始买了多少桃子。(使用Java实现)
小明买了一堆桃子,不知道个数,第一天吃了一半的桃子,还不过瘾,又多吃了一个。以后他每天吃剩下的桃子的一半还多一个,到n天只剩下一个桃子了。问:最开始买了多少桃子。(使用Java实现)
|
8月前
|
存储 Java 程序员
深度理解JAVA中的栈、堆、对象、方法区、类和他们之间的关系
1.方法:当一个方法执行时,该方法都会建立自己的内存栈,在该方法内定义的变量将会逐个放入内存栈中,随着方法执行结束,该方法的内存栈也将自然销毁.因此,所有在方法中定义的局部变量都是放在栈内存中的。
152 0
深度理解JAVA中的栈、堆、对象、方法区、类和他们之间的关系
|
5月前
|
存储 Java BI
MAT工具定位分析Java堆内存泄漏问题方法
MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版,可以直接解压使用。
51 0
|
6月前
|
存储 算法 Java
数据结构——堆、堆排序和优先级队列(代码为Java版本)
数据结构——堆、堆排序和优先级队列(代码为Java版本)
|
6月前
|
Java 程序员 API
Java语言特点 && 8种基本数据类型 && 标识符等练习题 && 插入/希尔/选择/堆/冒泡/快速/归并/计数排序
Java语言特点 && 8种基本数据类型 && 标识符等练习题 && 插入/希尔/选择/堆/冒泡/快速/归并/计数排序
31 0
|
8月前
|
缓存 算法 Java
java学会这些,我就入门啦!(基础篇一)栈与堆
java学会这些,我就入门啦!(基础篇一)栈与堆