
复制// Java import java.util.Arrays; import java.util.NoSuchElementException; public class BinaryHeap { private static final int d = 2; private int[] heap; private int heapSize; /** * This will initialize our heap withdefaultsize. */ public BinaryHeap(int capacity) { heapSize = 0; heap = new int[capacity + 1]; Arrays.fill(heap,聊聊 -1); } public boolean isEmpty() { return heapSize == 0; } public boolean isFull() { return heapSize == heap.length; } private int parent(int i) { return (i - 1) / d; } private int kthChild(int i, int k) { return d * i + k; } /** * Inserts new element into heap * Complexity: O(log N) * As worst case scenario, we need to traverse till the root */ public void insert(int x) { if (isFull()) { throw new NoSuchElementException("Heap is full, No space to insert new element"); } heap[heapSize] = x; heapSize ++; heapifyUp(heapSize - 1); } /** * Deletes element atindex x * Complexity: O(log N) */ publicintdelete(int x) { if (isEmpty()) { throw new NoSuchElementException("Heap is empty, No element to delete"); } int maxElement = heap[x]; heap[x] = heap[heapSize - 1]; heapSize--; heapifyDown(x); return maxElement; } /** * Maintains the heap property while inserting an element. */ private void heapifyUp(int i) { int insertValue = heap[i]; while (i > 0 && insertValue > heap[parent(i)]) { heap[i] = heap[parent(i)]; i = parent(i); } heap[i] = insertValue; } /** * Maintains the heap property while deleting an element. */ private void heapifyDown(int i) { int child; inttemp = heap[i]; while (kthChild(i, 1) < heapSize) { child = maxChild(i); if (temp >= heap[child]) { break; } heap[i] = heap[child]; i = child; } heap[i] = temp; } private int maxChild(int i) { int leftChild = kthChild(i, 1); int rightChild = kthChild(i, 2); return heap[leftChild] > heap[rightChild] ? leftChild : rightChild; } /** * Prints all elements of the heap */ public void printHeap() { System.out.print("nHeap = "); for (int i = 0; i < heapSize; i++) System.out.print(heap[i] + " "); System.out.println(); } /** * This method returns the max element of the heap. * complexity: O(1) */ publicint findMax() { if (isEmpty()) throw new NoSuchElementException("Heap is empty."); return heap[0]; } publicstatic void main(String[] args) { BinaryHeap maxHeap = new BinaryHeap(10); maxHeap.insert(10); maxHeap.insert(4); maxHeap.insert(9); maxHeap.insert(1); maxHeap.insert(7); maxHeap.insert(5); maxHeap.insert(3); maxHeap.printHeap(); maxHeap.delete(5); maxHeap.printHeap(); maxHeap.delete(2); maxHeap.printHeap(); } } 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.




