接着上一篇,是利用堆这种数据结构去实现优先队列。
优先队列(priority queue)是一种用来维护一组元素组成的集合S的数据结构,其中每一个元素都有一个相关的的值,称为关键字(key)。最大优先队列支持以下操作:
- insert(S, x):将元素x插入到S中;
- maximum(S):返回S中具有最大key的元素;
- extractMax(S):去掉并返回S中具有最大key的元素;
- increaseKey(S, x, k):将元素x的key值增加到k(k不能小于原key值);
以下直接给出四个操作参考代码,我在代码中相应的做出了一些解释。
一、
private static void Insert(int[] a, int key) {
// 插入一个数
int heap_size = a.length;
heap_size = heap_size + 1; // 堆中的顺序改变了, 但是原数组的长度没有改变, 动态改变数组长度以存放这个元素
int [] b = new int[heap_size];
System.arraycopy(a, 0, b, 0, heap_size - 1);//a中的元素赋给b
b[heap_size - 1] = Integer.MIN_VALUE;//先给新增的位置赋值,设置为无穷小
Increase_key(b, heap_size - 1, key);
System.out.println(Arrays.toString(b));
}
二、
private static int Heap_maximum(int[] a) {//返回最大键字的元素
int size = a.length;
Build_MAXheap(a, size);
return a[0];
}
三、
private static int Extract_max(int[] a) {
//去掉 并 返回 该集合中具有最大值键的元素
int heap_size = a.length - 1;
int maximum = a[0];
a[0] = a[heap_size];
heap_size --;
MAX_heapify(a, 0, heap_size);
return maximum;
}
四、
private static void Increase_key(int[] a, int i, int key) {
// 将i表示对应的值增加到 key, 这里假设key的值不小于i 的原关键字值 a[i] 更新新的值
if(key < a[i]){
System.out.println("不符合条件!");
}
a[i] = key;
while(i > 0 && a[(i - 1) / 2] < a[i]){//parent(i) = (i - 1) / 2
int temp = a[i];
a[i] = a[(i - 1) / 2];
a[(i - 1)/ 2] = temp;
i = i / 2;
}
}
在以上的操作中,需要使用两个其他的方法:MAX_heapify(a, i, heap_size) 和 Build_MAXheap(a, size)。可参看我的另一篇文章:
点击打开链接。
测试代码和截图:
public static void main(String[] args) {
int [] a = {15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1};
System.out.println(Heap_maximum(a));
System.out.println(Extract_max(a));
System.out.println(Arrays.toString(a));//测试删除后的数组
int i = 6, key = 18;
Increase_key(a, i, key);
System.out.println(Arrays.toString(a));
int key1 = 20;
Insert(a, key1);
}
参考:
《算法导论》
以上就是该篇文章的内容,如果存在错误或者有什么可以改进的地方,请您指出,谢谢!