优先级队列,数值越小,优先级越高。优先级越高的最新被删除,区别于普通的队列先进先出。
算法如下:
定义结点:
class Node {
private int iData;
public Node(int iData) {
this.iData = iData;
}
public int getIData() {
return iData;
}
public void setIData(int data) {
iData = data;
}
}
public class PriorityQueue_Heap {
private Node[] heapNode;
private static final int max_size = 50;// 最大结点数
private int current_index = 0;
private static final int max_Value = 50;//结点最大值
public PriorityQueue_Heap(int size) throws InterruptedException {
current_index = 0;
heapNode = new Node[max_size];
Random random = new Random();
for (int i = 0; i < size; i++) {
int value = random.nextInt(max_Value);
buildMinHeap(value);
}
}
/**
* 构造最小堆
*
* @param value
* @return
*/
public boolean buildMinHeap(int value) {
Node node = new Node(value);
if (current_index == max_size) {
return false;
} else {
heapNode[current_index] = node;
tickleUp(current_index);
current_index++;
return true;
}
}
/**
* 向上调整
*
* @param current_index
*/
public void tickleUp(int current_index) {
int parent = (current_index - 1) / 2;// 找到当前节点的父节点
// 暂存当前节点值
Node bottom = new Node(heapNode[current_index].getIData());
while (current_index > 0
&& heapNode[parent].getIData() > bottom.getIData()) {
// 父节点下移
heapNode[current_index].setIData(heapNode[parent].getIData());
current_index = parent;
parent = (current_index - 1) / 2;
}
heapNode[current_index] = bottom;
}
/**
* 向下调整
*
* @param index
*/
public void tickleDown(int index) {
int minChild;//当前结点两个孩子结点中大的那个下标
Node top = heapNode[index];
while (index < current_index / 2) {
int leftChild = 2 * index + 1;
int rightChild = leftChild + 1;
// 如果右节点存在,并且由节点大于左节点。则右节点就是最大的节点
if (rightChild < current_index
&& heapNode[rightChild].getIData() < heapNode[leftChild]
.getIData()) {
minChild = rightChild;
} else {
minChild = leftChild;
}
// 找到了这样的节点比字节的还小
if (top.getIData() < heapNode[minChild].getIData()) {
break;
} else {
heapNode[index] = heapNode[minChild];
index = minChild;
}
}// end while
heapNode[index] = top;
}
/**
* 取优先级最高的节点
*
* @return
*/
public int min() {
return heapNode[0].getIData();
}
/**
* 往大堆中插入一个新节点
*
* @param key
*/
public void insert(int key) {
buildMinHeap(key);
}
/**
* 从大堆中删除优先级最高的节点,同时把最后一个节点放入到根节点,然后调整
*
* @param key
*/
public Node delMin() {
Node root = heapNode[0];
if (current_index == 0) {
return null;
}
heapNode[0] = heapNode[--current_index];
// 向下刷新
tickleDown(0);
return root;
}
/**
* 显示大堆
*/
public void disHeap() {
System.out.print("heapArray:");
for (int i = 0; i < heapNode.length; i++) {
if (heapNode[i] != null) {
System.out.print(heapNode[i].getIData() + ",");
} else
break;
}
System.out.println(" ");
}
public static void main(String[] args) throws InterruptedException {
PriorityQueue_Heap ph = new PriorityQueue_Heap(10);
ph.disHeap();
System.out.println("min:" + ph.min());
int inValue = 20;
System.out.println("insert value:"+inValue);
ph.insert(inValue);
ph.disHeap();
System.out.println("del value:"+inValue);
System.out.println("the min="+ph.delMin().getIData());
ph.disHeap();
}