优先队列

接着上一篇,是利用堆这种数据结构去实现优先队列。

优先队列(priority queue)是一种用来维护一组元素组成的集合S的数据结构,其中每一个元素都有一个相关的的值,称为关键字(key)。最大优先队列支持以下操作:
  1. insert(S, x):将元素x插入到S中;
  2. maximum(S):返回S中具有最大key的元素;
  3. extractMax(S):去掉并返回S中具有最大key的元素;
  4. 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);
	}


参考: 《算法导论》

以上就是该篇文章的内容,如果存在错误或者有什么可以改进的地方,请您指出,谢谢!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值