java使用堆结构实现优先队列

package com.structures.tree;

import java.util.NoSuchElementException;


/*
 * 小顶堆 java使用堆结构实现优先队列
 * http://www.oschina.net/code/snippet_855019_15069
 */
public class JPriorityQueue<E> {

	class QueueNode<E> {
		int capacity;
		int size;
		E[] queue;

		QueueNode(int capacity) {
			this.capacity = capacity;
		}
	}

	QueueNode<E> node;

	public void print()
	{
		E[] objs=this.node.queue;
		for(int i=0;i<this.node.size;i++)
		{
			System.out.print(objs[i]+"  ");
		}
		System.out.println();
	}
	public JPriorityQueue(int capacity) {
		node = new QueueNode<E>(capacity);
		node.size = 0;
		node.queue = (E[]) new Object[capacity + 1];

	}

	public void add(E x) {
		int k = node.size;
		while (k > 0) {
			int parent = (k - 1) / 2;
			E data = node.queue[parent];
			Comparable<E> key = (Comparable) x;
			if (key.compareTo(data) >= 0)
				break;
			node.queue[k] = data;
			k = parent;
		}
		node.queue[k] = x;
		node.size++;

	}

	public E remove() {
		int parent = 0;
		if (node.size == 0) {
			throw new NoSuchElementException("queue is null");
		}
		E min = node.queue[0];// top
		E last = node.queue[node.size - 1];// last
		node.queue[0] = last;// add the last to top
		node.queue[node.size - 1] = null;
		node.size--;
		Comparable<? super E> complast = (Comparable<? super E>) last;
		if (node.size == 2 && complast.compareTo(node.queue[1]) > 0) { // 只剩下最后两个结点,进行比较
			node.queue[0] = node.queue[1];
			node.queue[1] = last;
		}
		if (node.size > 2) { // 大于三个结点的,向下旋转
			while (parent < node.size / 2) {
				int left = 2 * parent + 1;// left child
				int right = left + 1;// right child
				E root = node.queue[parent];
				Comparable<? super E> comproot = (Comparable<? super E>) root;
				if (comproot.compareTo(node.queue[left]) < 0
						&& comproot.compareTo(node.queue[right]) < 0)
					break;
				Comparable<? super E> compleft = (Comparable<? super E>) node.queue[left];
				if (compleft.compareTo(node.queue[right]) <= 0) {
					node.queue[parent] = node.queue[left];
					node.queue[left] = root;
					parent = left;
				} else {
					node.queue[parent] = node.queue[right];
					node.queue[right] = root;
					parent = right;
				}
				if (right * 2 >= node.size)
					break;

			}

		}
		return min;
	}

	public static void main(String[] args) {
		JPriorityQueue<String> queue = new JPriorityQueue<String>(10);

		queue.add("Z");
		queue.add("B");
		queue.add("QZA");
		queue.add("QBA");
		queue.add("EAA");
		queue.add("A");

		queue.print();
		// queue.remove();
		// queue.remove();
		// queue.remove();
		// queue.remove();
		// queue.remove();
		System.out.println(queue.remove());
		System.out.println(queue.remove());
		System.out.println(queue.remove());
		System.out.println(queue.remove());
		System.out.println(queue.remove());
		System.out.println(queue.remove());

	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值