最小堆java

在Java中,最小堆(Min Heap)可以用數組來實現。最小堆是一種特殊的完全二叉樹,其中每個節點的值都不大於其父節點的值。最小堆可以用來實現優先佇列,其中堆頂總是最小的元素。

下面是一個簡單的Java實現,使用數組和索引計算來表示最小堆:

import java.util.*;

public class MinHeap {
    private int[] array;
    private int size;

    public MinHeap(int capacity) {
        array = new int[capacity + 1];
        size = 0;
    }

    public void insert(int value) {
        if (size == array.length - 1) {
            throw new IllegalStateException("Heap is full");
        }
        array[++size] = value;
        int parent = (size - 1) / 2;
        while (parent >= 0 && array[parent] > array[size]) {
            swap(parent, size);
            parent = (parent - 1) / 2;
            size--;
        }
    }

    public int extractMin() {
        if (size == 0) {
            throw new IllegalStateException("Heap is empty");
        }
        int min = array[1];
        swap(1, size);
        size--;
        int child = 1;
        while (child * 2 <= size) {
            int smallest = child * 2;
            if (smallest < size && array[smallest] > array[smallest + 1]) {
                smallest++;
            }
            if (array[1] <= array[smallest]) {
                break;
            }
            swap(1, smallest);
            child = smallest;
        }
        return min;
    }

    private void swap(int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    public int size() {
        return size;
    }

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

    public void printHeap() {
        for (int i = 1; i <= size; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}

public class MinHeapExample {
    public static void main(String[] args) {
        MinHeap minHeap = new MinHeap(10);
        minHeap.insert(10);
        minHeap.insert(5);
        minHeap.insert(1);
        minHeap.insert(7);
        minHeap.insert(3);
        minHeap.printHeap();
        System.out.println("Extract min: " + minHeap.extractMin());
        minHeap.printHeap();
    }
}

在這個實現中,MinHeap類包含一個大小為capacity + 1的數組,其中capacity是堆的最大容量。size變數表示當前堆中元素的數量。insert方法用於將新元素插入到堆中,extractMin方法用於提取堆頂(最小)元素,並保持堆結構不變。printHeap方法用於列印堆的內容。

main方法中,我們創建了一個容量為10的最小堆,並插入了一些元素。然後我們列印了堆的內容,並提取了堆頂元素。注意,在提取堆頂元素後,堆結構會發生變化,因為我們需要將最後一個元素移動到堆頂,並重新調整堆結構。