实现一个优先级队列
内部方法:
(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());
}
}
有错误还望指出哈