`
henry2009
  • 浏览: 93822 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

优先队列--Java

    博客分类:
  • java
阅读更多

优先队列的java实现

注:当时写好之后忘了检查,这个优先队列有点缺陷~~~嘻嘻,不过我在工作环境中已经作了修改

package test;

import java.util.Comparator;

/**
 * @作用:优先队列
 * @author henry
 * @date 2010-4-30
 */
public class PriQueue<E> {

	private static int DEFAULT_CAPECITY = 11;
	private Object[] objs;
	private Comparator<? super E> comparator;
	private int size = 0;

	public PriQueue() {
		this(DEFAULT_CAPECITY, null);
	}

	public PriQueue(Comparator<? super E> comparator) {
		objs = new Object[DEFAULT_CAPECITY];
		this.comparator = comparator;
	}

	public PriQueue(int capecity, Comparator<? super E> comparator) {
		if (capecity < 0) {
			throw new IllegalArgumentException();
		}
		objs = new Object[++capecity];
		this.comparator = comparator;

		heapfix();
	}

	public PriQueue(int capecity) {
		this(capecity, null);
	}

	private void heapfix() {
		if (objs != null) {
			return;
		}

		for (int i = size >> 1; i > 0; i--) {
			fixdown(i);
		}
	}

	/**
	 * 插入数据
	 * @param o
	 */
	public void add(E o) {
		if (o == null) {
			throw new NullPointerException("你插入了一个空对象");
		}

		if (size > Integer.MAX_VALUE) {
			throw new OutOfMemoryError("数组爆了,不能再插入!");
		}

		if (++size >= objs.length) {
			grow(size);
		}

		objs[size] = o;
		fixup(size);

	}

	/**
	 * 交换数据
	 * @param i
	 * @param k
	 */
	private void exchange(int i, int k) {

		if (i < 1 || k < 1 || i > Integer.MAX_VALUE || k > Integer.MAX_VALUE) {
			throw new IllegalArgumentException();
		}

		Object tmp = objs[i];
		objs[i] = objs[k];
		objs[k] = tmp;
	}

	/**
	 * 比较节点数据
	 * @param o1
	 * @param o2
	 * @return int
	 */
	@SuppressWarnings("unchecked")
	public int compare(E o1, E o2) {
		if (this.comparator != null) {
			return this.comparator.compare(o1, o2);
		} else {
			return ((Comparable<E>) o1).compareTo(o2);
		}
	}

	/**
	 * 增长队列
	 * @param index
	 */
	public void grow(int index) {
		if (index > Integer.MAX_VALUE) {
			throw new IllegalArgumentException("插入太多了~~");
		}

		int newLen = objs.length;
		if (index < newLen) {
			return;
		}

		if (newLen < index) {
			if (newLen < Integer.MAX_VALUE >> 1) {
				newLen = Integer.MAX_VALUE;
			} else {
				newLen <<= 1;//如果index > newLen,至少超出数组界限两位
			}
		}

		Object[] tmp = new Object[newLen + 1];
		System.arraycopy(objs, 0, tmp, 0, objs.length);

		objs = tmp;
	}

	/**
	 * 最大堆排序
	 * @param index
	 */
	@SuppressWarnings("unchecked")
	private void fixup(int index) {
		if (index <= 1 || index > Integer.MAX_VALUE) {
			return;
		}

		int p = index >>> 1;
		if (compare((E) objs[p], (E) objs[index]) < 0) {
			exchange(p, index);
		}

		fixup(p);
	}

	/**
	 * 最小堆排序
	 * @param i
	 */
	@SuppressWarnings("unchecked")
	private void fixdown(int i) {

		if (i >= size) {
			return;
		}

		int largest = i;
		int left = i << 1;
		int right = left + 1;

		if (left > size) {
			return;
		}

		if (right > size) {
			right = left;
		}

		if (compare((E) objs[largest], (E) objs[left]) < 0) {
			largest = left;
		}

		if (compare((E) objs[largest], (E) objs[right]) < 0) {
			largest = right;
		}

		if (i != largest) {
			exchange(i, largest);
			fixdown(largest);
		}

	}

	/**
	 * 检查队列是否还有数据
	 * @return boolean
	 */
	public boolean isHasElement() {
		if (size > 0) {
			return true;
		}

		return false;
	}

	/**
	 * 获取数据,但不会移除数据
	 * @param index
	 * @return Object
	 */
	public Object get(int index) {
		if (index > size || index < 0) {
			throw new IllegalArgumentException();
		}

		return objs[index + 1];
	}

	/**
	 * 获取数据,并移除队列的头部
	 * @return
	 */
	public Object poll() {
		if (objs.length > 1)
			return remove(1);

		return null;
	}

	/**
	 * 获取指定位置的数据,并移除
	 * @param i
	 * @return
	 */
	public Object remove(int i) {

		if (i > Integer.MAX_VALUE) {
			throw new OutOfMemoryError("索引值过大");
		}

		if(i > size) {
			throw new OutOfMemoryError("超出队列范围");
		}
		
		if (i < 1) {
			return null;
		}

		exchange(i, size);
		--size;
		fixdown(i);
		return objs[size + 1];
	}

	/**
	 * 移除指定元素,并取之
	 * 不存在该元素,则返回null
	 * @param o
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Object remove(E o) {
		for(int i = 0; i < objs.length; i++) {
			if(this.compare(o, (E)objs[i]) == 0) {
				return remove(i);
			}
		}
		
		return null;
	}
	
	public static void main(String[] args) {

		int[] arr = { 1, 5, 2, 33, 20, 11, 8 };
		PriQueue<Integer> q = new PriQueue<Integer>(5);

		for (int a : arr) {
			q.add(a);
		}

		System.out.println("最大堆:");
		for (int i = 0; i < arr.length; i++) {
			System.out.print(q.get(i) + " ");
		}
		System.out.println();

		System.out.println("最小堆:");
		StringBuilder sb = new StringBuilder();
		while (q.isHasElement()) {
			sb.append(q.poll() + " ");
		}

		System.out.println(sb.toString());
	}
}
1
1
分享到:
评论

相关推荐

    优先队列-java可以选择属性和升序降序

    优先队列在Java编程中是一种特殊的数据结构,它遵循特定的出队顺序,通常是最小元素(最小优先队列)或最大元素(最大优先队列)先出队。这种数据结构在解决各种问题时非常有用,例如任务调度、事件驱动编程、搜索...

    用数组实现的优先队列(JAVA)

    在Java中,我们可以使用数组来实现优先队列。这篇文章将探讨如何利用数组实现优先队列,并通过提供的`PriorityQ.java`文件来深入理解其实现原理。 1. **优先队列基本概念** 优先队列是一种数据结构,它维护了一个...

    优先队列算法实现(Java)

    - Java的`java.util.PriorityQueue`是优先队列的实现,它基于二叉堆(通常是最小堆),满足堆的性质:父节点的优先级总是不小于子节点。 - PriorityQueue支持`add()`、`offer()`、`peek()`、`poll()`等方法,分别...

    用堆实现简单的优先队列(JAVA)

    PriorityQueue.java 可能是实现了优先队列类,而 PQTest.java 可能是用来测试该优先队列功能的代码。 1. **PriorityQueue类**: - **构造函数**:可能会包含一个无参构造函数,用于创建空的优先队列,也可能有带...

    基于java优先队列(PriorityQueue)的多路排序算法(含代码)

    在Java编程中,优先队列(PriorityQueue)是一种特殊的队列,它按照元素的优先级进行出队。这种数据结构在实现多路归并排序(Multi-Merge Sort)时非常有用,因为它能有效地处理多个已排序的输入流,并将它们合并成...

    简单的优先队列

    在这个话题中,我们将深入探讨与“简单的优先队列”相关的几个核心概念,包括平衡树、背包、图的结构,以及Java中的相关实现。 1. 平衡树: 平衡树是一种自平衡二叉查找树,如AVL树或红黑树。它们保证了任何节点的...

    优先队列(Priority Queue)是一种特殊类型的队列

    在编程语言中,很多库提供了优先队列的实现,例如C++中的`&lt;queue&gt;`库和`&lt;priority_queue&gt;`模板,Java的`java.util.PriorityQueue`类,Python的`heapq`模块等。这些库通常提供上述的基本操作,并且性能高效,因为它们...

    多级优先队列.zip

    在这个“多级优先队列.zip”压缩包中,提供了一个用Java实现的多级反馈队列模型,并带有图形用户界面(GUI),使得理解和学习变得更加直观。 多级优先队列的基本思想是将任务或请求分配到多个队列中,每个队列对应...

    Java优先队列(PriorityQueue)示例Java

    Java的优先队列(PriorityQueue)是Java集合框架中一个重要的数据结构,它是一个基于堆实现的无界队列。优先队列中的元素按照优先级排序,最高的优先级元素总是在队列的头部。在Java中,PriorityQueue类位于`java....

    队列(数据结构--Java版)

    4. **PriorityQueue**:不同于普通队列,PriorityQueue 是一个优先队列,元素按照其自然排序顺序或自定义比较器进行排序。插入元素时,队列会自动调整元素顺序。 队列在实际应用中广泛用于任务调度、事件处理、缓冲...

    Java优先队列的实现

    数据结构与算法第六章,优先队列,heap_maximum 返回优先队列的最大值 heap_extract_max 删除并返回最大值 max_heap_insert插入值为key的元素进优先队列中 。

    算法-树形结构- 优先队列.rar

    6. **Java中的优先队列**:在Java编程语言中,`java.util.PriorityQueue`类提供了优先队列的实现。它可以存储任何实现了`Comparable`接口的对象,或者在创建时提供一个自定义的比较器。 7. **C++中的优先队列**:在...

    装载问题-分支限界算法-java实现

    在java实现中,使用了FIFO队列来存储可能的解决方案,并使用剪枝函数来减少搜索空间。Java实现的主要步骤包括: 1. 初始化FIFO队列和剪枝函数。 2. 生成可能的解决方案,并将其存储在FIFO队列中。 3. 使用剪枝函数...

    算法设计中关于优先队列式分支限界法解装载问题的代码

    分支限界法中的优先队列式分支限界法解装载问题

    Java语言编写的数据结构-队列实现

    - **广度优先搜索(BFS)**:在图或树的搜索算法中,队列常用来遍历节点。 理解并熟练运用这些数据结构是提升编程能力的关键,无论是解决问题还是优化代码性能。通过Java实现不同的队列结构,可以更好地适应各种...

    优先队列(1).zip

    在编程语言中,很多都内置了优先队列的库或模块,例如Python的`heapq`模块,Java的`PriorityQueue`类,C++的`priority_queue`容器等,这些工具方便开发者直接使用优先队列功能。 总的来说,优先队列作为数据结构的...

    JAVA中的优先队列与堆(POJ 2442)

    在Java编程语言中,优先队列(PriorityQueue)和堆(Heap)是两种重要的数据结构,它们在处理具有优先级的元素时非常有用。本文将深入探讨这些概念,并结合题目"POJ 2442"来理解它们的应用。 首先,优先队列是一种...

    旅行商问题-A算法-java

    7. **Java编程**:在Java中,可以使用`java.util.PriorityQueue`实现优先队列,`ArrayList`或`HashSet`用于存储节点和邻居,`Node`类封装节点信息,包括位置、成本、启发式值和前驱节点。同时,需要编写合适的比较器...

    Java Methods-Heaps and Priority Queues.ppt

    Java堆和优先队列 Java堆和优先队列是数据结构中两个重要的概念,在Java编程中经常被使用。在本文中,我们将详细介绍Java堆和优先队列的定义、实现和应用。 一、堆(Heap) 堆是一种特殊的二叉树,它能够实现优先...

    常用数据结构(堆栈,队列,列表)JAVA代码

    在这个主题中,我们将深入探讨Java实现的三种基本数据结构:堆栈(Stack)、队列(Queue)和列表(List)。这些概念是计算机科学的核心部分,对理解和解决复杂问题至关重要。 1. **堆栈(Stack)**: - 堆栈是一种...

Global site tag (gtag.js) - Google Analytics