1. 程式人生 > 實用技巧 >自定義最小優先佇列

自定義最小優先佇列

/**
 * @desc: 最小優先佇列,值越小,優先順序越高,其實就是構造小頂堆
 * @author: 毛會懂
 * @company: 容易網
 * @create: 2021-01-06 16:34:00
 **/
public class MyMinPriorityQueue<T extends Comparable<T>> {
    private T[] arr;
    private Integer size;

    public MyMinPriorityQueue(Integer size){
        arr = (T[])new Comparable[size];
        
this.size = 0; } //佇列是否為空 public Boolean isEmpty(){ return size == 0; } //佇列的大小 public Integer getSize(){ return size; } //插入元素 public void add(T t){ //插入到陣列的末尾(陣列的第0個元素不儲存,方便元素的上浮和下沉) arr[++size] = t; //上浮 swim(size); }
//刪除最小元素 public T delMax(){ if(size == 0){ return null; } T t = arr[1]; //最大的元素(第1個位置)和最後一個元素做交換 exec(1,size); size--; //下沉第一個位置的元素 sink(1); return t; } //上浮 public void swim(Integer k){ while (k > 1){
if(less(k,k/2)){ exec(k,k/2); } k = k /2; } } //下沉 public void sink(Integer k){ while (2 * k < size){ int max; if(2 * k + 1 <= size) { if (less(2 * k, 2 * k + 1)) { max = 2 * k; } else { max = 2 * k + 1; } }else{ max = 2 * k; } if(less(max,k)){ exec(max,k); } k = max; } } //比較兩個元素的大小(arr[i]小,返回True) private Boolean less(int i,int j){ return arr[i].compareTo(arr[j]) < 0; } //交換兩個元素位置 private void exec(int i,int j){ T t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }

測試程式碼:

//最小優先佇列
public static void main(String[] args) {
char[] chars = {'A','H','D','O','E','W','G','T'};
MyMinPriorityQueue<Character> myHeap = new MyMinPriorityQueue<>(20);
for(int i = 0;i < chars.length;i++){
myHeap.add(chars[i]);
}

System.out.println("---------");

for(int i = 0;i < chars.length;i++){
System.out.print(myHeap.delMax() + ", ");
}
System.out.println("over");
}