package org.oscim.utils; public class MinHeap { private int[] data; private float[] heap; public static final class Item { public int pos; public float prio; public int index; } int size; private final Item it = new Item(); public MinHeap(float[] heap, int[] data) { this.heap = heap; this.data = data; size = 1; } public void push(float prio, int d) { int idx = size++; int n = idx >> 1; while (idx > 1 && heap[n] > prio) { heap[idx] = heap[n]; data[idx] = data[n]; idx = n; n >>= 1; } heap[idx] = prio; data[idx] = d; } public Item pop() { if (size == 1) return null; it.pos = data[1]; it.prio = heap[1]; int idx = --size; if (idx > 1) { heap[1] = heap[idx]; data[1] = data[idx]; heapify(); } return it; } public int peek() { return data[1]; } private void heapify() { float root = heap[1]; int tmp = data[1]; int last = size; int idx = 1; while (true) { // left child int c = idx << 1; if (c > last) break; // right child if (c + 1 <= last && heap[c + 1] < heap[c]) c++; float val = heap[c]; if (val >= root) break; heap[idx] = val; data[idx] = data[c]; idx = c; } heap[idx] = root; data[idx] = tmp; } public static void main(String[] args) { MinHeap h = new MinHeap(new float[10], new int[10]); h.push(10, 10); h.push(12, 12); h.push(21, 21); h.push(31, 31); h.push(14, 14); h.push(2, 2); Item it; for (int i = 0; i < 10; i++) { it = h.pop(); if (it != null) System.out.println(it.pos + " " + it.prio); } } }