`
BradyZhu
  • 浏览: 246835 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(数据结构与算法分析 七)------优先队列中的二叉堆的实现( Java语言描述)

 
阅读更多

优先队列是至少允许插入和删除最小者这两个操作的数据结构。其中,对于优先队列的实现,二叉堆是很常见的。

堆是一棵被完全填满的二叉树,可能例外是底层,底层上的元素从左到右依次填入。

而且如果使用数组表示二叉堆,那么对于数组上的任意位置i上的元素,其左儿子的位置是2i,右儿子在左儿子后的单元(2i +1)中,他的父亲则在位置[i/2]上。

堆的性质,在堆中,对于每一个节点X,X的父亲中的关键字小于或者等于X中的关键字,根节点除外。其中根节点是堆中关键字最小的元素。所以二叉堆的最小元可以在根处找到。

上滤策略为,现在空闲位置创建一个空穴,如果X可以放在空穴中而不破坏堆排序,那么插入完成,否则,把空穴的父节点上的元素移入空穴中,这样,空穴就朝着根的方向上行进一步,直到可以插入为止。

下面的代码为二叉堆的实现

package com.bird.six;

/**
 * @category 二叉堆的实现
 * @author Bird
 *
 */
public class BinaryHeap {
	
	private static final int DEAFAULT_CAPACITY = 100;
	private int currentSize;//堆中的元素个数
	private Compare[] array;//存储堆中的元素使用数组存储方式
	
	public BinaryHeap(){
		this(DEAFAULT_CAPACITY);
	}
	
	public BinaryHeap(int capacity){
		currentSize = 0;
		array = new Compare[capacity+1];
		
	}
	
	public boolean isEmpty(){
		return currentSize == 0;
	}
	
	public boolean isFull(){
		return currentSize == array.length-1;
	}
	
	public void makeEmpty(){
		currentSize = 0;
	}
	
	/**
	 * 插入使用“上移”法
	 * @param x
	 */
	public void insert(Compare x){
		if(isFull())
			throw new RuntimeException("溢出");
		
		int hole = ++currentSize;
		for(; hole >1 && x.compareTo(array[hole/2]) < 0; hole /= 2)
			array[hole] = array[hole/2];
		array[hole] = x; 
	}
	
	/**
	 * 使用下溢法进行删除操作
	 * @return
	 */
	public Compare deleteMin(){
		if(isEmpty())
			return null;
		
		Compare minItem = array[1];
		array[1] = array[currentSize--];
		percolateDown(1);
		
		return minItem;
	}
	
	private void percolateDown(int hole){
		int child = 0;
		Compare tmp = array[hole];
		
		for(; hole * 2 <= currentSize; hole = child){
			child = hole * 2;
			if(child != currentSize && array[child+1].compareTo(array[child])<0)
				child++;
			if(array[child].compareTo(tmp)<0)
				array[hole] = array[child];
			else 
				break;
		}
		array[hole] = tmp;
	}
}

class Compare implements Comparable<Object>{

	public int compareTo(Object o) {
		return ((Integer)this.compareTo(o));
	}
	
}


分享到:
评论

相关推荐

    数据结构与算法分析_Java语言描述(第2版)]

    Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。随着计算机速度的不断增加和功能...

    数据结构与算法分析_Java语言描述(第2版)

    《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...

    数据结构与算法分析Java语言描述(第二版)

    摊还分析11.1 一个无关的智力问题11.2 二项队列11.3 斜堆11.4 斐波那契堆11.4.1 切除左式堆中的节点11.4.2 二项队列的懒惰合并11.4.3 斐波那契堆操作11.4.4 时间界的证明11.5 伸展树小结练习参考文献第12章 高级...

    Java数据结构与算法中的源代码和applet - 站长下载

    书名:数据结构Java版 图书编号:2086963 出版社:清华大学 定价:118.0 ISBN:730213544 作者:(美)福特(Ford,W.H.),(美)托普(Topp,W.R.) 著,梁志敏 译 出版日期:2006-11-11 版次: 开本: 简介: 本书...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    6.4.2 事件模拟 6.5 d-堆 6.6 左式堆 6.6.1 左式堆性质 6.6.2 左式堆操作 6.7 斜堆 6.8 二项队列 6.8.1 二项队列结构 6.8.2 二项队列操作 6.8.3 二项队列的实现 6.9 标准库中的优先队列 小...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    6.4.2 事件模拟 6.5 d-堆 6.6 左式堆 6.6.1 左式堆性质 6.6.2 左式堆操作 6.7 斜堆 6.8 二项队列 6.8.1 二项队列结构 6.8.2 二项队列操作 6.8.3 二项队列的实现 6.9 标准库中的优先队列 小...

    数据结构与算法分析 Java语言描述第2版

    内容简介《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...

    (java语言描述+源码)数据结构与算法

    《数据结构与算法分析:Java语言描述 第2版 》是国外数据结构与算法分析方面的经典教材 使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计) 随着计算机速度...

    数据结构与算法分析_Java_语言描述

    小结 练习 参考文献 第6章 优先队列(堆) 6.1 模型 6.2 一些简单的实现 6.3 二叉堆 6.3.1 结构性质 6.3.2 堆序性质 6.3.3 基本的堆操作 6.3.4 其他的堆操作 6.4 优先队列的应用 6.4.1 选择问题 6.4.2...

    Java数据结构与算法-笔记-代码-课件-资料

    稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...

    Data-Structure:《数据结构与算法分析》上的代码实现

    《数据结构与算法分析》上的代码实现, 按照该书的章节顺序,主要实现书上给出的例子。 ##已经实现: ###第三章 - 链表 - 栈 - 队列 ###第四章 - 排序二叉树 - 平衡二叉树 - 伸展树(自底向上) - 伸展树(自顶往下)...

    java数据结构与算法第二版

    数据结构和算法能起到什么作用? 数据结构的概述 算法的概述 一些定义 面向对象编程 软件工程 对于C++程序员的Java Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将...

    java算法与数据结构

    .算法与数据结构基本概念 (1)数据、数据对象和数据结构 ...6.算法分析与设计基础 (1)分治与递归的关系 (2)贪心算法的思想 (3)回溯与分支限界算法的比较 (4)算法时间和空间复杂度的简单分析

    Java数据结构与算法视频教程

    课程内容第一章: 数据结构与算法概述; 算法分析; 冒泡排序; 选择排序; 插入排序; 希尔排序; 归并排序;第二章: 快速排序; 排序稳定性分析; 顺序表; 链表;第三章: 栈; 队列; 符号表; 二叉查找树;第...

    数据结构与算法笔记+LeetCode经典例题分析

    数据结构与算法笔记+LeetCode经典例题分析。 其中包括八大排序算法、动态规划背包问题、深度优先搜索、广度优先搜索、队列、优先队列、栈、并查集、树、二叉树、二叉搜索树、AVL平衡二叉树等等。

    数据结构与算法.xmind

    数据结构与算法 排序算法 内排序 八大基础排序 选择排序 简单选择排序 思想 每次选择最大的数插入到末尾中 做法 外层for循环控制次数 内层for循环找出最大的值的角...

    【超全!】图解Java数据结构和算法(共195集)【资料+视频+课件+代码+笔记】

    稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...

    数据结构(C语言版)\Java数据结构和算

    9.1 单端优先队列和双端优先队列 9.2 左倾树 9.3 二项式堆 9.4 Fibonacci堆 9.5 配偶堆 9.6 对称最小-最大堆 9.7 区间堆 9.8 参考文献和选读材料 第10章 高效二叉查找树 10.1 最优二叉查找树 10.2 AVL树 ...

    算法 第4版-谢路云译-带完整书签

    1.4 算法分析 108 1.4.1 科学方法 108 1.4.2 观察 108 1.4.3 数学模型 112 1.4.4 增长数量级的分类 117 1.4.5 设计更快的算法 118 1.4.6 倍率实验 121 1.4.7 注意事项 123 1.4.8 处理对于输入的...

Global site tag (gtag.js) - Google Analytics