1.知识储备:
2.编码实现:
package PriorityQueue;
public class minPriorityQueue<T extends Comparable<T>> {
//存储数据
private T[] items;
//记录元素个数
private int N;
public minPriorityQueue(int capacity) {
// TODO Auto-generated constructor stub
this.items=(T[])new Comparable[capacity+1];
}
//判断索引i处的元素是否小于索引j处的元素
public boolean less(int i,int j){
return items[i].compareTo(items[j])<0;
}
//判断队列是否为空
public boolean isEmpty(){
return N==0;
}
//获取队列中元素个数
public int size(){
return N;
}
//交换索引i处与j处的值
public void exch(int i,int j){
T temp=items[i];
items[i]=items[j];
items[j]=temp;
}
//往队列中插入一个元素
public void insert(T t){
items[++N]=t;
swim(N);
}
//删除队列中最小的元素
public T delMin(){
T min=items[1];
items[1]=items[N];
N--;
sink(1);
return min;
}
//使用上浮算法,让处于k索引处的元素在队列中处于正确的位置
public void swim(int k){
while(k>1){
if(less(k,k/2)){
exch(k,k/2);
}
k=k/2;
}
}
//下沉算法,让k位置的元素在队列中处于正确的位置
public void sink(int k){
while(k*2<=N){
int min;
if(k*2+1<=N){
if(less(k*2+1,k*2)){
min=k*2+1;
}else{
min=k*2;
}
}
else{
min=k*2;
}
if(!less(min,k)){
break;
}
exch(min,k);
k=min;
}
}
}
3.测试类:
package PriorityQueue;
public class minPriorityQueueTest {
public static void main(String[] args) {
//创建队列
minPriorityQueue<String> queue =new minPriorityQueue<String>(10);
//插入元素
queue.insert("H");
queue.insert("D");
queue.insert("A");
queue.insert("C");
queue.insert("E");
queue.insert("G");
queue.insert("B");
queue.insert("F");
//循环删除最小元素
while(!queue.isEmpty()){
String min=queue.delMin();
System.out.print(min+" ");
}
}
}
4.测试结果: