2.4.27

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());
    }
}

猜你喜欢

转载自www.cnblogs.com/w-j-c/p/9143114.html