最小堆和最大堆的JAVA实现

/**
 * 文件名:BinaryHeap.java
 * 时间:2014年11月3日下午7:15:34
 * 作者:修维康
 */
package chapter6;

import java.util.*;

/**
 * 类名:BinaryHeap 说明:建立一个最小堆
 */
class MinHeap<AnyType extends Comparable<? super AnyType>> {
	private int currentSize;
	private static final int DEFAULT_CAPACITY = 10;
	private AnyType[] array;

	public MinHeap(AnyType[] items) {
		currentSize = items.length;
		array = (AnyType[]) new Comparable[currentSize + 1];
		int i = 1;
		for (AnyType item : items)
			array[i++] = item;
		buildHeap();
	}

	/**
	 * 方法名:percolateDown
	 * 说明:
	 */
	private void percolateDown(int position) {
		AnyType temp = array[position];
		int child;
		for (; position * 2 <= currentSize; position = child) {
			child = 2 * position;
			if (child != currentSize
					&& array[child + 1].compareTo(array[child]) < 0)
				child++;
			if (array[child].compareTo(temp) < 0)
				array[position] = array[child];

			else
				break;
		}
		array[position] = temp;
	}

	/**
	 * 方法名:buildHeap
	 * 说明:下滤的顺序很关键 从中间开始不断向上依次下滤
	 */
	private void buildHeap() {
		for (int i = currentSize / 2; i > 0; i--)
			percolateDown(i);
	}

	public void insert(AnyType x) {
		if (currentSize >= array.length - 1)
			enlargeArray(array.length * 2 + 1);
		int hole = ++currentSize;
		while (hole > 1 && x.compareTo(array[hole / 2]) < 0) {
			array[hole] = array[hole / 2];
			hole /= 2;
		}
		array[hole] = x;
	}

	private void enlargeArray(int capacity) {
		AnyType[] oldArr = array;
		AnyType[] newArr = (AnyType[]) new Comparable[capacity];
		for (int i = 1; i < array.length; i++)
			newArr[i] = oldArr[i];
		array = newArr;
	}

	public boolean isEmpty() {
		return currentSize == 0;
	}

	public AnyType deleMin() {
		if (!isEmpty()) {
			AnyType min = array[1];
			array[1] = array[currentSize--];
			percolateDown(1);
			return min;
		}
		return null;

	}

	public String toString() {
		StringBuffer sb = new StringBuffer();
		for (int i = 1; i <= currentSize; i++)
			sb.append(array[i] + " ");
		return new String(sb);
	}
}

/**
 * 类名:MaxHeap 说明:最大堆操作与建堆
 */
class MaxHeap<AnyType extends Comparable<? super AnyType>> {
	private AnyType[] array;
	private int currentSize;

	public MaxHeap(AnyType[] arr) {
		currentSize = arr.length;
		array = (AnyType[]) new Comparable[currentSize + 1];
		int i = 1;
		for (int j = 0; j < arr.length; j++)
			array[i++] = arr[j];
		buildHeap();
	}

	/**
	 * 方法名:buildHeap
	 * 说明:从中间开始到结束 不断上滤
	 */
	private void buildHeap() {
		for (int i = currentSize /2; i <= currentSize; i++)
			percolateUp(i);
	}

	private void percolateUp(int position) {
		AnyType temp = array[position];
		while (position > 1) {
			if (array[position / 2].compareTo(temp) < 0) {
				array[position] = array[position / 2];
				position /= 2;
			} else
				break;
		}
		array[position] = temp;
	}
	private boolean isEmpty(){
		return currentSize == 0;
	}
	public AnyType deleMax(){
		AnyType max = array[1];
		AnyType temp = array[currentSize--];
		int position = 1;
		int child;
		while(position *2 <= currentSize){
			child = 2 * position;
			if(child!=currentSize&&array[child].compareTo(array[child + 1]) < 0)
				child++;
			if(array[child].compareTo(temp) > 0)
				array[position] = array[child];
			else
				break;
			position = child;
		}
		array[position] = temp;
		return max;
	}
	public void insert(AnyType x){
		if(currentSize == array.length -1)
			enlargeArray( 2* currentSize +1);
		array[++currentSize] = x;
		percolateUp(currentSize);
	}
	private void enlargeArray(int capacity) {
		AnyType[] oldArr = array;
		AnyType[] newArr = (AnyType[]) new Comparable[capacity];
		for (int i = 1; i < array.length; i++)
			newArr[i] = oldArr[i];
		array = newArr;
	}
	public String toString() {
		StringBuffer sb = new StringBuffer();
		for (int i = 1; i <= currentSize; i++)
			sb.append(array[i] + " ");
		return new String(sb);
	}

}

public class HeapTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer[] arr = new Integer[] { 9,8,7,6,5, 4, 3, 2};
		MinHeap min = new MinHeap(arr);
		min.insert(10);
		min.deleMin();
		System.out.println(min);
		Integer[] arr2 = new Integer[] { 1, 2, 3, 4, 5,6,7,8,9,10};
		MaxHeap max = new MaxHeap(arr2);
		max.deleMax();
		max.insert(10);
		System.out.println(max);

	}
}

时间: 2024-10-09 08:07:22

最小堆和最大堆的JAVA实现的相关文章

最小堆_最大堆

在大数查找中会遇到一类问题,例如在100亿条数据中找出 最大的(最小的) 前1000个元素.以int型4Byte为例,有1*1010*4 B = 4*1010/(230) B = 37.25G. 直接读取到内存中显然不合适,那么就需要: 首先,读取前1000个元素,建立一个最小堆(最大堆): 其次,之后每读取一个元素就与最小堆根元素(1000个数中最小值)进行比较: 如果,新元素大于(小于)堆顶元素 则,删除堆顶元素,将新元素插入堆顶.然后调整堆序,删除堆顶....循环往复 #define le

通用的最小堆(最大堆)D-ary Heap

听说有一种最小(大)堆,不限于是完全二叉树,而是完全D叉树,名为D-ary Heap(http://en.wikipedia.org/wiki/D-ary_heap).D可以是1,2,3,4,100,对于优先队列该有的功能都没有问题. 动手写一个D-ary Heap,应该不难.简单起见,不考虑像STL一样通过template传入Comp类,下面的实现要求T类型重载了operator <和operator >. template<class T> class DaryHeap { s

java实现最小堆

1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于它的所有后裔,最小元在堆的根上. 堆总是一棵完全树 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆. 2.最小堆实现: 插入: 1)  将新插入的元素,放置到队列的尾部. 2)  若该元素小于其父节点,两个元素互换.(上移操作) 3)  迭代,直至该元素没有父节点或小于其父节点. 删除: 1)  移掉顶部的节点. 2)  将队末的元素放置到顶部. 3)  该节点与其子节点中较小的那个比

最小堆的建立 插入 与删除

堆是完全二叉树,完全二叉树最大的特点就是 把数据储存在数组里 通过父子结点的关系来做  不用实际建树  parent=leftchild/2: leftchild=2*parent  右就加1这儿指的是序号关系,储存的时候注意是利用树的逻辑图 从上到下 从左到右编号12345..... 建堆:实际是把数据先放入数组(注意下标从1开始),对应逻辑图,写调整代码,我的基本思路是从数组末尾开始,对应元素与其父节点比较,满足条件就换值,并且对被换的调用调整函数(要单独写个调整函数)因为被换的一个是可能不

Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个heap,一个是最小堆,一个是最大堆. 2.一直使maxHeap的size大于minHeap. 3. 当两边size相同时,比较新插入的value,如果它大于minHeap的最大值,把它插入到minHeap.并且把minHeap的最小值移动到maxHeap. ...具体看代码 1 /*********

数据结构-最大堆、最小堆【手动实现】

0,堆的简介 数据结构中的堆是一种特殊的二叉树,不同于 Java 内存模型中的堆. 堆必须符合以下两个条件: 是一棵完全二叉树. 任意一个节点的值都大于(或小于)左右子节点的值. 从第一点可以知道,堆适合用数组来存储. 第二点中,若父节点都大于等于左右子节点,则被称为大顶堆,反之则为小顶堆. 图-最大堆及其存储方式 0.1节点的父.子节点关系 一个节点[根节点除外]的父节点地址为其地址的二分之一,它的左子节点地址为其地址值的2倍,右子节点地址为其地址2倍加1.  例如:现在有个节点的地址为3,其

Black Box--[优先队列 、最大堆最小堆的应用]

Description Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empty and i equals 0. This Black Box processes a sequence of commands (transactions). There are t

C++ priority_queue 最大堆、最小堆

问题描述 通常在刷题的时候,会遇到最大堆.最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何处理?这时,就可以借助C++ STL的priority_queue. 具体分析 需要注意的是,C++ STL默认的priority_queue是将优先级最大的放在队列最前面,也即是最大堆.那么如何实现最小堆呢? 假设有如下一个struct: struct Node { int value; int idx; Node (int v, int i): value(v), idx

最大堆(最小堆)

最大堆是一种很有用的数据结构,它是一颗完全二叉树,并且如果一个节点有儿子节点,其关键字都不小于其儿子节点的关键字.(最小树反之:节点值不大于儿子节点的完全二叉树.) 最大堆使用的一个典型的地方就是找出无序数字中,最大的一个数字.比如100亿整数中找出最小的前100个数字,典型的解决方案之一就是:先去处前边一百个值,创建一个最大堆,然后顺序读入的剩下的每个值,如果值小于根节点值,则删除根节点,把这个值插入,重建最大堆.重复这过程.最后就得到了最小的前100个数字(如果找前100个最大的值,就建立一