Java最大优先队列设计与实现

Java 学习+面试指南:https://javaxiaobear.cn

1、API设计

类名 MaxPriorityQueue
构造方法 MaxPriorityQueue(int capacity):创建容量为capacity的MaxPriorityQueue对象
成员方法 private boolean less(int i,int j):判断堆中索引i处的元素是否小于索引j处的元素
private void each(int i,int j):交换堆中i索引和j索引处的值
public T delMax():删除队列中最大的元素,并返回这个最大元素
public void insert(T t):往队列中插入一个元素
private void swim(int k):使用上浮算法,使索引k处的元素能在堆中处于一个正确的位置
private void sink(int k):使用下沉算法,使索引k处的元素能在堆中处于一个正确的位置
public int size():获取队列中元素的个数
public boolean isEmpty():判断队列是否为空
成员变量 private T items:用来存储元素的数组
private int N:记录堆中元素的个数

2、代码实现

public class MaxPriorityQueue<T extends Comparable<T>> {

    private T[] items;

    private int size;

    public MaxPriorityQueue(int capacity){
        items = (T[]) new Comparable[capacity + 1];
        size = 0;
    }

    /**
     * 判断堆中索引i处的元素是否小于索引j处的元素
     * @param i
     * @param j
     * @return true
     */
    private boolean less(int i,int j){
        return items[i].compareTo(items[j]) < 0;
    }

    /**
     * 交换堆中i索引和j索引处的值
     * @param i
     * @param j
     */
   private void each(int i,int j){
       T temp = items[i];
       items[i] = items[j];
       items[j] = temp;
   }

    /**
     * 删除队列中最大的元素,并返回这个最大元素
     * @return
     */
   public T delMax(){
       T max = items[1];
       each(1,size);
       items[size] = null;
       size--;
       sink(1);
       return max;
   }

    /**
     * 往队列中插入一个元素
     * @param t
     */
   public void insert(T t){
      items[++size] = t;
      swim(size);
   }

    /**
     * 使用上浮算法,使索引k处的元素能在堆中处于一个正确的位置
     * @param k
     */
   private void swim(int k){
       while (1 < k){
           //比较k是否小于k/2,如果小于则交换元素
           if(less(k/2,k)){
               each(k/2,k);
           }
           k = k/2;
       }
   }

    /**
     * 使用下沉算法,使索引k处的元素能在堆中处于一个正确的位置
     * @param k
     */
   private void sink(int k){
       while (2 * k <= size){
           int max = 2 * k;
           //如果存在右子结点
           if(2 * k + 1 <= size){
               if(less(2*k,2*k+1)){
                   max = 2 * k + 1;
               }
           }
           //比较当前结点和子结点中的较大者,如果当前结点不小,则结束循环
           if(!less(k,max)){
               break;
           }
           each(k,max);
           k = max;
       }
   }

    /**
     * 获取队列中元素的个数
     * @return
     */
   public int size(){
       return size;
   }


    /**
     * 判断队列是否为空
     * @return
     */
    public boolean isEmpty(){
        return size == 0;
    }
}
  • 测试类

    public class MaxPriorityQueueTest {
    
        public static void main(String[] args) {
            String[] arr = {"A", "B", "C", "D", "E", "F", "G"};
            MaxPriorityQueue<String> queue = new MaxPriorityQueue(10);
            for (String s : arr) {
                queue.insert(s);
            }
            System.out.println(queue.size());
            String max;
            while (!queue.isEmpty()){
                max = queue.delMax();
                System.out.print(max+ " ");
            }
        }
    }
    

    输出结果

    7
    G F E D C B A 
    

Java最大优先队列设计与实现_第1张图片

你可能感兴趣的:(Java数据结构与算法,java,开发语言,最大优先队列,队列)