小根堆的实现
package util;import java.util.Arrays;import java.util.Random;public class Heap { // 实际大小 private int size; // 最大容量 private int capacity; // 数据 int[] data; /** * 初始化 */ public Heap() { size = 0; capacity = 100; data = new int[capacity]; } /** * 指定初始容量初始化 * * @param capacity 初始容量 */ public Heap(int capacity) { size = 0; this.capacity = capacity; data = new int[capacity]; } /** * 向下堆化 * * @param i 起始位置 */ private void fixDown(int i) { int num = data[i]; int son = i * 2 + 1; while ((son < size)) { if ((son + 1 < size) && (data[son] > data[son + 1])) { ++son; } if (num < data[son]) { break; } data[i] = data[son]; i = son; son = i * 2 + 1; } data[i] = num; } /** * 向上堆化 * * @param i 起始位置 */ private void fixUp(int i) { int num = data[i]; int father = (i - 1) / 2; while ((i > 0) && (data[father] > num)) { data[i] = data[father]; i = father; father = (i - 1) / 2; } data[i] = num; } /** * 添加元素 * * @param item 元素值 */ public void offer(int item) { // 扩容 if (size == capacity) { data = Arrays.copyOf(data, data.length * 2); capacity *= 2; } data[size++] = item; fixUp(size - 1); } /** * 删除堆顶元素 * * @return 原堆顶元素的值 */ public int poll() { if (size == 0) { throw new UnsupportedOperationException("堆为空"); } int ans = data[0]; data[0] = data[size - 1]; --size; fixDown(0); return ans; } /** * 堆是否为空 * @return 堆中无元素则空, 有元素则非空 */ public boolean isEmpty() { return size == 0; } public static void main(String[] args) { Heap heap = new Heap(); Random random = new Random(); for (int i = 0; i < 500; ++i) { heap.offer(random.nextInt(1000)); } while (!heap.isEmpty()) { System.out.println(heap.poll()); } }}