优先队列和堆篇(3)——借助堆实现优先队列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/86772215

1 借助堆实现优先队列

  • Queue.java
package heap;

public interface Queue<E> {

    int getSize();
    boolean isEmpty();
    void enqueue(E e);
    E dequeue();
    E getFront();

}

  • MaxHeap.java
package heap;


public class MaxHeap<E extends Comparable<E>> {

    private Array<E> data;

    public MaxHeap(int capacity) {
        data = new Array<E>(capacity);
    }

    public MaxHeap(E[] arr) {

        data = new Array<>(arr);

        for (int i = parent(arr.length - 1); i >= 0; i--) {
            siftDown(i);
        }

    }


    public MaxHeap() {
        data = new Array<>();
    }

    public int size() {
        return data.getSize();
    }

    public boolean isEmpty() {
        return data.isEmpty();
    }

    // 返回完全二叉树的数组表示中,一个索引所表示的元素的父亲节点的索引
    private int parent(int index) {

        if (index == 0) {
            throw new IllegalArgumentException("index-0 does't have parent");
        }

        return (index - 1) / 2;
    }

    // 返回完全二叉树的数组表示中,一个索引所表示的元素的左孩子节点的索引
    private int leftChild(int index) {
        return index * 2 + 1;
    }

    private int rightChild(int index) {
        return index * 2 + 2;
    }

    public void add(E e) {
        data.addLast(e);
        siftUp(data.getSize() - 1);
    }

    private void siftUp(int k) {

        while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0) {
            data.swap(k, parent(k));
            k = parent(k);
        }
    }

    // 查看堆中最大元素
    public E findMax() {

        if (data.getSize() == 0) {
            throw new IllegalArgumentException("heap is empty");
        }

        return data.get(0);
    }

    // 取出堆中最大的元素
    public E extractMax() {

        E ret = findMax();

        data.swap(0, data.getSize() - 1);
        data.removeLast();

        siftDown(0);

        return ret;
    }

    private void siftDown(int k) {

        while (leftChild(k) < data.getSize()) {

            int j = leftChild(k);

            if (j + 1 < data.getSize() &&
                    data.get(j + 1).compareTo(data.get(j)) > 0) {

                j = rightChild(k);

                // data[j] 是 leftChild 和 rightChild 中的最大值
            }

            if (data.get(k).compareTo(data.get(j)) >= 0) {
                break;
            }

            data.swap(k, j);
            k = j;
        }
    }

    /*
     *   取出堆中最大元素,并且替换成元素 e
     *
     * */

    public E replace(E e) {

        E ret = findMax();

        data.set(0, e);
        siftDown(0);

        return ret;
    }

}

  • PriorityQueue.java
package heap;

public class PriorityQueue<E extends Comparable<E>> implements Queue<E> {

    private  MaxHeap<E> maxHeap;

    public PriorityQueue(){
        maxHeap = new MaxHeap<>();
    }


    @Override
    public int getSize() {
        return maxHeap.size();
    }

    @Override
    public boolean isEmpty() {
        return maxHeap.isEmpty();
    }

    @Override
    public void enqueue(E e) {
        maxHeap.add(e);
    }

    @Override
    public E dequeue() {
        return null;
    }

    @Override
    public E getFront() {
        return maxHeap.findMax();
    }
}

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/86772215
今日推荐