question:
Find the minimum. Add a min() method to MaxPQ. Your implementation should use constant time and constant extra space.
answer:
//因为最小元素必然是在最底层或者是没有子结点的次底层,所以遍历他们找最小即可
import edu.princeton.cs.algs4.*; public class MaxPQ<Key extends Comparable<Key>> { private Key[] pq; private int N = 0; public MaxPQ(int maxN) { pq = (Key[]) new Comparable[maxN + 1]; } public boolean isEmpty() { return N == 0; } public int size() { return N; } public void insert(Key v) { pq[++N] = v; swim(N); } public Key delMax() { Key max = pq[1]; exch(1,N--); pq[N+1] = null; sink(1); return max; } public Key min()//就是这个 { int first = (N + 1)/2;//第一个没有子节点的节点,从这往后遍历到N来找min int minpos = first; for(int i = first + 1; i <= N; i++) { if(less(i,minpos)) minpos = i; } return pq[minpos]; } private boolean less(int i, int j) { return pq[i].compareTo(pq[j]) < 0; } private void exch(int i, int j) { Key t = pq[i]; pq[i] = pq[j]; pq[j] = t; } private void swim(int k) { while(k > 1 && less(k/2,k)) { exch(k/2,k); k/=2; } } private void sink(int k) { while(2*k <= N) { int j = 2*k; if(j < N && less(j,j+1)) j++; if(!less(k,j)) break; exch(k,j); k = j; } } public static void main(String[] args) { MaxPQ<Integer> pq = new MaxPQ<Integer>(200); for(int i = 1; i <= 200; i++) pq.insert(i); StdOut.println(pq.delMax()); StdOut.println(pq.min()); } }