`
lotusyu
  • 浏览: 34354 次
  • 性别: 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-数据结构代码实现

    8. **排序算法**:包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等,这些排序算法的Java实现可以帮助你理解它们的工作原理和效率。 9. **查找算法**:如二分查找、哈希查找等,这些算法在处理大...

    堆排序JAVA实现代码

    堆排序的核心思想是构建一个完全二叉树,即堆,然后通过调整堆结构,使得根节点(最大元素或最小元素)总能处于正确的位置。这个过程分为两个阶段:建堆和交换。 1. **建堆**:首先将待排序的序列构造成一个大顶堆...

    堆排序之Java实现

    以下是Java实现堆排序的基本步骤: 1. 构建大顶堆:从最后一个非叶子节点(即最后一个元素的父节点)开始,自底向上、自右向左进行调整,确保每个节点都大于或等于其子节点。 2. 交换堆顶元素与末尾元素:将最大...

    DSAA_堆排序java实现_源码

    标题中的“DSAA_堆排序java实现_源码”表明这是一个关于数据结构与算法分析(Data Structures and Algorithms Analysis,简称DSAA)的资料包,主要关注堆排序算法的Java实现。堆排序是一种高效的排序算法,它利用了...

    堆排序 java实现

    在Java中,我们通常会使用数组来模拟这个堆结构。在这个实例中,我们关注的是如何用Java来实现堆排序算法,并通过随机生成的数字进行验证。 首先,了解堆的基本概念。堆分为最大堆和最小堆,最大堆是每个父节点的值...

    JAVA基本5种数据结构的实现。

    虽然这里没有明确的堆实现文件,但Java提供了`java.util.PriorityQueue`来实现堆数据结构。 在实际编程中,这些数据结构的选择取决于特定的需求,例如快速访问、高效的插入和删除等。理解并熟练使用这些数据结构...

    Java实现堆并调整

    在Java编程中,堆是一种非常重要的数据结构,它通常用于实现优先队列或者优化排序算法,比如快速排序和堆排序。本篇文章将深入探讨如何在Java中实现堆的建立以及堆的向下和向上调整。 首先,我们需要理解堆的概念。...

    java 实现二叉排序树 堆

    以下是一个简单的Java实现: ```java public class Node { int key; Node left, right; public Node(int item) { key = item; left = right = null; } } public class BinarySearchTree { Node root; //...

    数据结构java版

    9. **排序算法**:在Java中实现的各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,都是基于特定数据结构的优化操作。 10. **搜索算法**:深度优先搜索(DFS)和广度优先搜索(BFS)是...

    最大(小)堆Java实现

    在Java实现中,可以创建一个MaxHeap类,包含以下方法: - `void insert(int value)`:插入一个新元素。 - `int extractMax()`:删除并返回最大元素。 - `void buildHeap(int[] arr)`:将给定数组建立为最大堆。 - `...

    数据结构-java实现一个简单的最小堆结构SimpleHeap

    数据结构-java实现一个简单的最小堆结构SimpleHeap,展示了如何使用数组来实现最小堆,实现了最小堆的基本操作:插入和删除。insert 方法将元素添加到堆中,并调用 siftUp 方法来维护堆的性质。remove 方法删除堆顶...

    常用数据结构java实现

    了解和熟练掌握这些数据结构及其Java实现对于提升编程技能和解决实际问题至关重要。通过实践和不断学习,我们可以更有效地设计和优化算法,从而提高程序的性能和效率。在实际项目中,选择合适的数据结构往往能显著...

    数据结构JAVA版

    学习数据结构Java版,你需要理解这些基础概念,熟悉它们的实现原理,并能够根据实际需求选择合适的数据结构。通过实践,你将掌握如何利用Java的数据结构优化算法,提高代码性能,解决复杂问题。

    数据结构(java版本)

    《数据结构(Java版本)》这本书正是为此目的而编写,旨在将理论与实际编程相结合,通过Java语言来实现各种经典的数据结构。 首先,书中的基础部分会介绍数据结构的基本概念,如数组、链表、栈和队列。数组是最基本...

    数据结构常考知识点(java实现版)

    以下将详细介绍标题和描述中涉及的数据结构常考知识点及其Java实现。 1. 线性表: 线性表是最基础的数据结构,包括数组和链表两种形式。在Java中,数组是最直接的线性表实现,可以直接声明并初始化。链表则通过节点...

    用Java实现数据结构中的队列

    本篇文章将深入探讨如何用Java语言来实现这种基本的数据结构。 1. **队列的基本操作** - **enqueue()**: 将元素添加到队列的尾部。这是队列的插入操作。 - **dequeue()**: 移除并返回队列的头部元素。这是队列的...

    数据结构java语言描述课后答案.docx

    标题提及的是“数据结构java语言描述课后答案”,这通常指的是学生在学习数据结构课程时,针对教材或课堂讲解的习题解答。这些答案涵盖了数据结构的基本概念、逻辑结构、存储结构以及算法的时间和空间复杂度分析。 ...

    java实现内存动态分配

    Java 实现内存动态分配主要涉及Java内存模型以及内存管理...综上所述,Java实现内存动态分配涉及到对堆内存、栈内存的理解,以及对垃圾回收机制的掌握。通过实验模拟,可以更直观地了解这些概念在实际操作中的应用。

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

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

Global site tag (gtag.js) - Google Analytics