`
lotusyu
  • 浏览: 33622 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

堆结构的java实现

阅读更多
闲时写了一个heap的数据结构,支持最大堆,最小堆。

import java.util.Comparator;

/**
 * 堆数据结构
 * 
 * @author Administrator
 * 
 */
public class Heap<T> {

	/**
	 * 以数组形式存储堆元素
	 */
	private T[] heap;

	/**
	 * 用于比较堆中的元素。c.compare(根,叶子) > 0。 
	 * 使用相反的Comparator可以创建最大堆、最小堆。
	 */
	private Comparator<? super T> c;

	public Heap(T[] a, Comparator<? super T> c) {
		this.heap = a;
		this.c = c;
		buildHeap();
	}

	/**
	 * 返回值为i/2
	 * 
	 * @param i
	 * @return
	 */
	private int parent(int i) {
		return (i - 1) >> 1;
	}

	/**
	 * 返回值为2*i
	 * 
	 * @param i
	 * @return
	 */
	private int left(int i) {
		return ((i + 1) << 1) - 1;
	}

	/**
	 * 返回值为2*i+1
	 * 
	 * @param i
	 * @return
	 */
	private int right(int i) {
		return (i + 1) << 1;
	}

	/**
	 * 堆化
	 * 
	 * @param i
	 *           堆化的起始节点
	 */
	private void heapify(int i) {
		heapify(i, heap.length);
	}

	/**
	 * 堆化,
	 * 
	 * @param i
	 * @param size 堆化的范围
	 */
	private void heapify(int i, int size) {
		int l = left(i);
		int r = right(i);
		int next = i;
		if (l < size && c.compare(heap[l], heap[i]) > 0)
			next = l;
		if (r < size && c.compare(heap[r], heap[next]) > 0)
			next = r;
		if (i == next)
			return;
		swap(i, next);
		heapify(next, size);
	}

	/**
	 * 对堆进行排序
	 */
	public void sort() {
		// buildHeap();
		for (int i = heap.length - 1; i > 0; i--) {
			swap(0, i);
			heapify(0, i);
		}
	}

	/**
	 * 交换数组值
	 * 
	 * @param arr
	 * @param i
	 * @param j
	 */
	private void swap(int i, int j) {
		T tmp = heap[i];
		heap[i] = heap[j];
		heap[j] = tmp;
	}

	/**
	 * 创建堆
	 */
	private void buildHeap() {
		for (int i = (heap.length) / 2 - 1; i >= 0; i--) {
			heapify(i);
		}
	}

	public void setRoot(T root) {
		heap[0] = root;
		heapify(0);
	}

	public T root() {
		return heap[0];
	}

	/**
	 * 取出最大元素并从堆中删除最大元素。
	 * 
	 * @param
	 * @param a
	 * @param comp
	 * @return
	 */
	// public T extractMax(T[] a, Comparator<? super T> comp) {
	// if (a.length == 0) {
	// throw new
	// IllegalArgumentException("can not extract max element in empty heap");
	// }
	// T max = a[0];
	// a[0] = a[a.length - 1];
	// heapify(0, a.length - 1);
	// return max;
	// }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Integer[] temp = null;
		temp = new Integer[] { 5, 2, 4, 6, 1, 3, 2, 6 };
		temp = new Integer[] { 16, 14, 8, 7, 9, 3, 2, 4, 1 };

		Comparator<Integer> comp = new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return o1 - o2;
			}
		};
		//创建最大堆
		Heap<Integer> heap = new Heap<Integer>(temp, comp);
		// heap.buildHeap();
		for (int i : temp) {
			System.out.print(i + " ");
		}
		System.out.println();
		
		heap.sort();
		for (int i : temp) {
			System.out.print(i + " ");
		}
		System.out.println();
	}

}


通过Comparator控制堆的性质(是最大堆还是最小堆)
创建最大堆
Heap<Integer> heap = new Heap<Integer>(topn,new Comparator<Integer>() {

	@Override
	public int compare(Integer o1, Integer o2) {
            //生成最大堆使用o1-o2,生成最小堆使用o2-o1 		
	    return o1-o2;
	}
});


创建最小堆
Heap<Integer> heap = new Heap<Integer>(topn,new Comparator<Integer>() {

	@Override
	public int compare(Integer o1, Integer o2) {
            //生成最大堆使用o1-o2,生成最小堆使用o2-o1 		
	    return o2-o1;
	}
});

分享到:
评论
2 楼 attend 2012-01-13  
不好意思,看错了。 if (r < size && c.compare(heap[r], heap[next]) > 0)   看成
if (r < size && c.compare(heap[r], heap[i]) > 0)  了。
1 楼 attend 2012-01-13  
 
private void heapify(int i, int size) {   
        int l = left(i);   
        int r = right(i);   
        int next = i;   
        if (l < size && c.compare(heap[l], heap[i]) > 0)   
            next = l;   
        if (r < size && c.compare(heap[r], heap[next]) > 0)   
            next = r;   
        if (i == next)   
           return;   
        swap(i, next);   
        heapify(next, size);   
}

有点问题,
swap(i, next);  
        heapify(next, size);  
应该放到if块里吧?

相关推荐

    数据结构堆排序的java算法实现

    数据结构堆排序的java算法实现,里面用java语言实现了堆排序的算法实现,有输入和输出结果

    数据结构-从应用到实现 (java版)

    《计算机科学丛书·数据结构从应用到实现(Java版)》系统地介绍了数据结构以及数据结构与对象之间的联系。主要内容包括:算法效率的输入规模、阶和大O,数据结构的无序和有序列表,队列和栈基于数组和链表的设计实例...

    堆排序JAVA实现代码

    代码十分清楚的描述了堆排序是如何进行的,配合笔者写的博客,可以将此种算法掌握的十分牢靠,代码结构清晰。

    常用数据结构java实现

    采用java实现,实现了常用的数据结构,包括顺序表、链表、队列、栈(数组实现和链表实现)、二叉树(二叉排序树)、图(深度优先、广度优先)

    数据结构与问题求解Java语言

    本书的目的是从抽象思维和问题求解的观点提供对数据结构的实用介绍,试图包含有关数据结构、算法分析及其Java实现的所有重要的细节。作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据...

    JAVA 2平台安全技术-结构,API设计和实现

    并在此基础上,详细描述了Java 2平台中新增加的许多安全结构方面的措施,同时对Java安全性的实施提出了使用指导,描绘了如何定制、扩展和精化安全结构以及成功实现的技术细节。本书为建立安全、有效、强大和可移植的...

    DSAA_堆排序java实现_源码

    数据结构与算法分析的一些有所帮助的课件,希望能帮到刚学习的人

    java实现堆排序算法

    排序阶段:依次从堆顶(最大值)开始,将堆顶元素与末尾元素交换,然后重新调整堆结构,再重复这一过程直到所有元素都排好序。 在 heapify 方法中,根据当前父节点的索引 i,找到其左子节点和右子节点的索引,然后...

    基于java实现的10种基本排序方式

    用java实现了10种基础排序,其内容包括: 1.冒泡排序 2.选择排序 3.插入排序 4.快速排序 5.希尔排序 6.归并排序 7.堆排序 8.桶排序 9.基数排序 10.计数排序 如有疑问请私信我

    常用数据结构及其算法的Java实现

    本项目主要使用Java实现各种经典常用数据结构及其算法,包括但不仅限于链表、栈,队列,树,图等经典数据结构。 八大排序算法及其实现,具体包括直接插入排序,希尔排序,直接选择排序,堆排序,冒泡排序,快速排序...

    七大排序算法的java实现

    插入排序,选择排序,冒泡排序,归并排序,快速排序,堆排序,希尔排序的java实现

    heap:纯Java实现的简单堆数据结构

    堆 纯Java实现的简单堆数据结构

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

    本书的目的是从抽象思维和问题求解的观点提供对数据结构的实用介绍,试图包含有关数据结构、算法分析及其Java实现的所有重要的细节。作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据...

    常用数据结构及其算法的Java实现.zip

    包括但不仅限于链表、栈,队列,树,堆,图等经典数据结构及其他经典基础算法(如排序等)... Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,...

    堆排序的原理和代码实现

    对于堆排序的java实现的理解,是初学数据结构的人的入门资源

    Java 2平台安全技术-结构,API设计和实现

    4.2.3 配置一个可选Policy类的实现 72 4.2.4 缺省的策略文件格式 72 4.2.5 策略文件举例 75 4.2.6 策略文件中的属性扩展 76 4.3 数字证书 77 4.4 有用的安全工具 80 4.4.1 密钥数据库 80 4.4.2 keytool 82 4.4.3 ...

    常用数据结构及其算法的Java实现,包括但不仅限于链表、栈,队列,树,堆,图等经典数据结构及其他经典基础算法(如排序.zip

    常用数据结构及其算法的Java实现,包括但不仅限于链表、栈,队列,树,堆,图等经典数据结构及其他经典基础算法(如排序

    Java超详细!Java实现数据结构PPT课件

    复杂度 时间复杂度 空间复杂度 线性数据结构动态数组(ArrayList) 链表(LinkedList) 单向链表 双向链表 循环链表 静态链表 栈(Stack) 队列(Queue) ...二叉堆(BinaryHeap) 优先级队列(PriorityQueue)

    医院手术安排管理程序(数据结构java)

    使用最小堆实现优先队列来管理手术病人信息(身份证号、姓名、性别、手术允许等待期限),实现病人信息的录入, 病人的手术安排,查看下一个进行手术的病人信息, 正在等待手术的病人的数量和退出程序.

Global site tag (gtag.js) - Google Analytics