`
cjf068
  • 浏览: 34425 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

大根堆

 
阅读更多
大根堆,可用于优先级队列
package org.jf.alg;

/**
 * 大根堆
 * 
 * @author junfeng.chen
 *
 * @param <T>
 */
public class BigHeadBinaryHeap <T extends Comparable>
{
	private int step = 64;
	private Object [] array;
    private int last_indx = 0;
	public BigHeadBinaryHeap(int initial_size,int step)
	{
		if(step>0)
		this.step = step;
		array = new Object[initial_size+1];
	}
	
	
	public BigHeadBinaryHeap()
	{
		array = new Object[33];
	}
	
	
	public void push(T data)
	{
		if(this.last_indx==array.length-1)
		{
			Object newarray []= new Object[array.length+this.step]; 
			System.arraycopy(array, 1, newarray, 1, array.length-1);
			array = newarray;
		}
		array[last_indx+1] = data;
		last_indx ++;
		
		int indx = last_indx;
		while(indx>1)//向上检查 保证满足堆性质
		{
			int pdx = indx/2;//父亲 index
			if(((T)array[indx]).compareTo(((T)array[pdx]))>0)
			{
				Object tmp = array[indx];
				array[indx] = array[pdx];
				array[pdx]=tmp;
				indx = pdx;
			}else
			{
				break;
			}
		}
		
	}
	
	public T pop()
	{
		T data = null;
		if(last_indx==0)
			return null;
		
		
		data = (T) array[1];
		array[1] = array[last_indx];
		array[last_indx]	= null;
		last_indx -- ;

		//根节点与左右子节点中最小元素交换
		
		int indx = 1;

		int max_indx =indx;
		Object tmp = null;
		while((max_indx=getMaxIndx(indx))!=indx)
		{
			//indx 与 min_indx元素交换
			tmp = array[indx];
			array[indx]=array[max_indx];
			array[max_indx]=tmp;
			indx = max_indx;
		}
		
		return data;
	
	}
	
	private int getMaxIndx(int indx)
	{
		
		T left = null;
		T right = null;
		if(indx*2>this.last_indx)//没有子节点
			return indx;
		if(indx*2==this.last_indx)
			left = (T)array[indx*2];
		else
		{
			left = (T)array[indx*2];
			right =(T)array[indx*2+1];
		}
		
		
		if(right==null)
		{
		
			if(left.compareTo((T)array[indx])>0)
				indx =  indx*2;
		}else
		{
			
			if(left.compareTo((T)array[indx])>0)
			{
				indx = indx*2;
				if(right.compareTo((T)array[indx])>0)
					indx = indx+1;
			}
			else if(right.compareTo((T)array[indx])>0)
			{
				indx = indx*2+1;
			}
			
			
		}
		
		return indx;
	}
	 void printArray()
		{
			for(int i=1;i<=this.last_indx;i++)
			{
				System.out.print(array[i].toString()+" ");
			}
			System.out.println("\n");
		}
	 
	public T peek()
	{
		if(this.last_indx>0)
		return (T) array[1];
		return null;
	}
	
	public boolean isEmpty()
	{
		return last_indx==0;
	}
	
	public int size()
	{
		return last_indx;
	}
	
	public Object[] getAll()
	{
		Object newArray[] = new Object[this.last_indx];
		System.arraycopy(array, 1, newArray, 0, last_indx);
		return newArray;
	}
}

分享到:
评论

相关推荐

    C++模板实现大根堆的插入删除以及初始化

    大根堆是一种特殊的完全二叉树,其每个节点的值都大于或等于其子节点的值,这种数据结构常用于实现优先队列。在C++中,我们可以利用模板类来实现大根堆,以适应不同类型的元素。下面将详细介绍如何使用C++模板实现...

    大根堆(小根堆)实现-优先队列

    在计算机科学中,堆是一种特殊的树形数据结构,它的每个节点都有一个值,并且满足堆的性质:在大根堆中,每个父节点的值都大于或等于其子节点的值;而在小根堆中,每个父节点的值都小于或等于其子节点的值。这些特性...

    c++ 大根堆和小根堆

    二是堆有两种类型——大根堆和小根堆。在大根堆中,每个父节点的值都大于或等于其子节点的值,而在小根堆中,情况相反,每个父节点的值都小于或等于其子节点的值。这些特性使得堆在查找最大或最小元素时非常高效。 ...

    大根堆(C++)示例代码

    根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)。 大根堆要求 ①根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值。 ②为完全二叉树。

    STL_quene.rar_crowd7oc_优先队列 堆_大根堆_大根对 c++_小根堆

    在本案例中,我们将探讨如何使用STL来实现大根堆和小根堆,以及它们在优先队列中的应用。 首先,大根堆和小根堆是堆数据结构的两种常见类型。堆通常是一个完全二叉树,其中每个父节点的值都大于或等于其子节点的值...

    数据结构课设——小大根交替堆实现的双端优先级队列及应用

    小大根交替堆是一种特殊的堆结构,它可以同时满足大根堆和小根堆的性质。在本文中,我们将对小大根交替堆实现的双端优先级队列进行详细的分析和设计。 双端优先级队列是一种特殊的队列结构,它可以同时满足队列的 ...

    堆排序(大根堆)

    小菜初来乍到,水平有限,但个人觉得代码应该正确易懂吧,求网友指教

    Java实现堆排序(大根堆)的示例代码

    Java实现堆排序(大根堆)的示例代码 Java是目前最流行的编程语言之一,堆排序是Java中的一种常见排序算法。本文将详细介绍Java实现堆排序(大根堆)的示例代码,涵盖大根堆的定义、建立大根堆的方法、堆排序算法的...

    以向下调整的方式建立大根堆

    以向下调整的方式建立大根堆

    小大根交替堆实现双端优先队列

    小大根交替堆是一种特殊的二叉堆,它的每个父节点的值要么小于或等于其左右子节点(类似于最小堆),要么大于或等于其左右子节点(类似于最大堆)。在交替堆中,这两个条件会交替出现,形成一种混合的堆结构。这样的...

    堆排序总结 堆排序总结

    在一个堆中,每个节点的关键字都不大于(对于大根堆)或都不小于(对于小根堆)它的孩子节点的关键字。堆可以分为两种类型:大根堆和小根堆。 - **大根堆**:根节点的关键字是所有节点中最大的。 - **小根堆**:根...

    数据结构常见问题:12单元15 堆.doc

    在本篇内容中,我们将深入探讨堆的概念,特别是单元15中提及的大根堆和小根堆。 1. 堆的定义与性质 堆通常被定义为一个完全二叉树,其中每个节点的关键字(key)满足特定的堆性质。堆有两种基本类型:大根堆和小根...

    python实现堆和索引堆的代码示例

    堆分为大根堆和小根堆,大根堆是父节点大于左右子节点,并且左右子树也满足该性质的完全二叉树。小根堆相反。可以利用堆来实现优先队列。 由于是完全二叉树,所以可以使用数组来表示堆,索引从0开始[0:length-1]。...

    详解Java常用排序算法-堆排序

    堆排序是一种树形选择排序算法,它的基本思想是将待排序的数组构建成一个大根堆(或小根堆),然后将堆顶元素与堆底元素交换位置,再将剩余元素重新构建成堆,重复执行交换和重构堆的操作,直到整个数组有序。...

    C#实现堆排序-代码示例

    在C#中,我们从数组的最后一个非叶子节点(即最后一个元素的父节点,位置为n/2-1)开始,递归地向下调整,确保每个节点满足大根堆的性质。`Heapify`方法就是用来完成这一过程的。它通过比较节点与其子节点的值,如果...

    算法数据结构——堆,直接便可编译通过,功能丰富

    根据给定的信息,本文将对堆这种数据结构进行详细的阐述,并着重介绍大根堆与小根堆的概念、实现原理及应用场景。此外,还将基于提供的代码片段解析堆的基本操作及其内部机制。 ### 一、堆的概念 堆是一种特殊的...

    堆与堆排序.ppt

    对于一个含有n个元素的序列 {a1, a2, …, an},如果满足ai ≤ a2i 或 ai ≥ a2i,則称该序列为小根堆或大根堆。小根堆指的是每个非叶子节点的值小于或等于其孩子节点的值,而大根堆是每个非叶子节点的值大于或等于其...

    算法导论系列读书笔记之六

    《算法导论》系列读书笔记之六主要涵盖了优先级队列、堆排序以及大根堆和最大堆等重要概念。这些知识点在计算机科学与技术领域,尤其是数据结构和算法分析中占据着核心地位。下面将对这些内容进行深入的探讨。 ...

    数据结构课程设计 实验报告——堆排序

    堆排序的基本思想是先将待排序的序列构造成一个大根堆(或小根堆),然后将堆顶元素与末尾元素交换,减少堆的大小,并对剩余的部分再次调整为大根堆(或小根堆)。通过重复这一过程,可以逐步得到排序后的序列。 ##...

    堆排序算法详细配图讲解

    在堆排序中,堆被定义为满足以下性质的完全二叉树:对于每个非叶子节点,其值大于或等于(在大根堆中)或小于或等于(在小根堆中)其左右孩子的值。堆排序算法在实际应用中通常用数组来实现堆的结构,因为数组能够...

Global site tag (gtag.js) - Google Analytics