最小堆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的最小堆,並插入了一些元素。然後我們列印了堆的內容,並提取了堆頂元素。注意,在提取堆頂元素後,堆結構會發生變化,因為我們需要將最後一個元素移動到堆頂,並重新調整堆結構。