优先级队列(堆)

实现一个优先级队列

内部方法:
(1)建大(小)堆
(2)调整堆
(3)入队列
(4)出队列
实现的是一个大堆的优先级队列

package test_9_22;

public class MyPriorityQueue {
    private int[] array;
    private int size;

    public MyPriorityQueue() {
        array = new int[16];
        size = 0;
    }

    //交换
    public void swap(int[] array,int index1,int index2){
        int t = array[index1];
        array[index1] = array[index2];
        array[index2] = t;
    }
    //向下调整小堆
    public void shiftDownSmall(int[] array,int i,int size){
        while(2 * i + 1 < size){
            //i写成1
            int min = 2 * i +1;
            if(min + 1 < size && array[min] > array[min+1]){
                min = min+1;
            }
            if(array[i] <= array[min]){
                break;
            }
            swap(array, i, min);
            i = min;
        }
    }


    //向下调整大堆
    public void shiftDownBig(int[] array,int i,int size){
        while(2 * i +1 < size){
            int max = 2 * i +1;
            //比两个都大,那就比两个孩子中最大的大
            if(max + 1 < size && array[max] < array[max+1]){
                max = max+1;
            }
            if(array[i] >= array[max]){
                break;
            }
            swap(array,i,max);
            i = max;
        }
    }

    //建小堆
    public void createSmallHeap(int[] array,int size){
        for(int i = (size-2)/2;i >= 0;i--){
            shiftDownSmall(array,i,size);
        }
    }

    //向上调整
    public void shiftUpSmall(int[] array,int i){
        while(i != 0){
            int parent = (i - 1) / 2;
            if(array[parent] > array[i]){
                break;
            }
            swap(array,i,parent);
            i = parent;
        }
    }

    //建大堆
    public void creatBigHeap(int[] array,int size){
        for(int i = (size-2)/2;i >= 0;i--){
            shiftDownBig(array,i,size);
        }
    }
    //入队列
    public void offer(int element){
        array[size++] = element;
        shiftUpSmall(array,size-1);
    }

    //出队列
    public int poll(){
        int element = array[0];
        array[0] = array[--size];
        shiftDownSmall(array,size,0);
        return element;
    }

    //
    public static void main(String[] args) {
        MyPriorityQueue myPriorityQueue = new MyPriorityQueue();
        myPriorityQueue.offer(7);
        myPriorityQueue.offer(9);
        myPriorityQueue.offer(5);
        System.out.println(myPriorityQueue.poll());
        myPriorityQueue.offer(3);
        myPriorityQueue.offer(7);

//        //java中的优先级队列(PriorityQueue默认是小堆,compareTo返回小的排前面)
//        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
//        priorityQueue.add(7);
//        priorityQueue.add(9);
//        priorityQueue.add(5);
//        System.out.println(priorityQueue.poll());
//        System.out.println(priorityQueue.poll());
    }

}

有错误还望指出哈

发布了57 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42419462/article/details/103217553