`
Jason5563
  • 浏览: 20781 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

Heap 堆

UP 
阅读更多

堆的Java实现:        

效果: 堆排序

83 83 83 77 75 74 73 72 62 55 53 44 39 34 34 33 31 30 28 24 23 22 22 19 19 18 11 6 2 2

 

import java.util.ArrayList;

/**
 * Data Structure -- Heap
 * @author Jason
 *
 */
public class Heap<T extends Comparable<T>> {

	// 堆是 完全二叉树,可以用数组存储
	ArrayList<T> items;
	
	public Heap(int cap)
	{	items = new ArrayList<T>(cap);	} 
	public Heap()
	{	items=new ArrayList<T>();		}
	
	// 添加,加到末尾,然后对末尾shift up
	public void add(T item)
	{
		items.add(item);
		shiftUp(items.size()-1);
	}
	// 删除堆顶,用末尾值替换 堆顶,然后对堆顶 shift down
	public T deleteMax()
	{
		if(items.isEmpty())	return null;
		T maxItem=items.get(0);
		T lastItem=items.remove(items.size()-1);
		if(items.size()!=0)
		{
			items.set(0, lastItem);
			shiftDown(0);
		}
		return maxItem;
	}
	
	// 如果父节点 小于 自己,上移
	void shiftUp(int index)
	{
		T me=items.get(index);
		int indexParent;
		while(index>0)
		{
			indexParent=(index-1)/2;
			if(me.compareTo(items.get(indexParent))>0)		// the son is larger than the father
			{
				items.set(index, items.get(indexParent));
				index=indexParent;
			}
			else break;
		}
		items.set(index, me);
	}
	// 如果 子节点中的较大值 大于 自己,交换下移
	void shiftDown(int index)
	{
		T me=items.get(index);
		int indexSon=index*2+1;	// left son right here
		while(indexSon<items.size())
		{
			// whether have right son, just get the largest son
			if(indexSon+1<items.size())
				indexSon= items.get(indexSon).compareTo(items.get(indexSon+1))>0? indexSon:(indexSon+1);
			
			if(me.compareTo(items.get(indexSon))<0)	// father is less than the son
			{
				items.set(index, items.get(indexSon));
				index=indexSon;
				indexSon=index*2+1;
			}
			else break;
		}
		items.set(index, me);
	}
	
	// 简单的添加,移出,相当于 堆排序
	public static void main(String[] args) {
		Heap<Integer> heap=new Heap<Integer>(100);   
        for(int i=0; i<30 ;i ++)   
        {   
            int temp=(int)(Math.random()*100);   
            heap.add(temp);   
        }   

        while(heap.items.size()!=0)
        {
        	System.out.print(heap.deleteMax()+" ");
        }
	}
}

 

分享到:
评论

相关推荐

    Heap堆解题套路【LeetCode刷题套路教程6】

    Heap堆解题套路【LeetCode刷题套路教程6】

    Java VM Heap 堆分析(节选)

    JVM堆分析,Java VM堆分析(节选)。 JProbe 是目前最好的Java性能优化工具之一,在全球有最多的用户。 本文档不但介绍了JProbe的在解决内存问题方面的功能和使用,同时还介绍了必要的Java内存管理的背景知识,深入...

    sort_heap push_heap pop_heap 堆的各种算法

    最近在学习STL的源代码,看到这么多优秀的代码,心里痒痒的,于是自己实现了一遍,当然,有自己的特色,都是模块函数,稍稍用了一些traits特性。相互学习,呵呵

    MaxHeap堆排序建堆类

    非常简单的一个最大堆的类,经过测试可以运行,希望可以对新手有所帮助。

    MaxHeap 最大堆

    用C++和模板实现最大堆,可用于简单排序操作

    weblogic优化指南.pdf

    垃圾收集(GC)是指JVM释放Java堆中不再使用的对象所占用...为了获取理想的Heap堆大小,需要使用-verbosegc参数(Sun jdk: -Xloggc:)以打开详细的GC输出。分析GC的频度和时间,结合应用最大负载所需内存情况,得出堆的大小。

    c语言stack(栈)和heap(堆)的使用详解

    2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块...

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    android项目内存泄露排查实用.pdf

    Dalvik VM 负责管理堆内存,与应用产生的垃圾对象的 GC,所以 DDMS 上只能看到 Dalvik 虚拟机使用的 heap 堆内存,看不到虚拟机宿主的 Linux 进程所使用的 native 堆的情况。Native 所用的空间由 Linux 统一管理,...

    java堆heapdump分析工具Heap Analzer V4

    15年7月最新版的工具Heap Analzer V4。 分析java内存堆快照的利器,拥有直觉性的判断溢出对象是什么,一目了然。支持上下左右键,免去鼠标点击的痛苦。 对象显示也比较详细,数量,大小都包含,支持对象树的复制。

    heapdump分析工具

    通过heapdump工具分析服务器堆分配问题

    java虚拟机OutOfMemoryError:Java heap space堆dump文件

    java虚拟机OutOfMemoryError:Java heap space堆dump文件,可以直接用来分析。

    堆溢出攻击教程(heap overflow attack)

    堆溢出攻击教程(heap overflow attack)

    二项堆python实现——eager binomial heap

    eager binomial heaps python实现。使用双向链表,make_heap, insert, merge, find_min, extractMin.

    斐波那契堆(Fibonacci Heap)

    在clion中对fibonacci heap的完全实现,亲测有效。

    c语言实现 小根堆heap

    c语言实现 小根堆heap,每次pop的时候都是最小值。整个值以数组形式储存!

    十三个常用算法

    二(三续)、Dijkstra 算法+Heap 堆的完整c 实现源码 三、dynamic programming 四、BFS 和DFS 优先搜索算法 五、红黑树算法的实现与剖析 五(续)、教你透彻了解红黑树 六、教你从头到尾彻底理解KMP 算法 七、遗传...

    java.lang.OutOfMemoryError: Java heap space 解决方法

    Java.lang.OutOfMemoryError: Java heap space 是 Java 中的一个常见错误,它发生时,Java 虚拟机 (JVM) 无法分配对象,因为堆空间不足。下面是解决该问题的一些方法: 原因分析 1. Java 虚拟机 (JVM) 内存过小:...

    Visual C++ 小内存堆(Small Block Heap)问题.docx

    Visual C++ 小内存堆(Small Block Heap)问题

    IBM heapdump analyzer

    在一些平台上,在有些情况下,javacore也被称为javadump,它包含jvm和应用程序相关的在特定时刻的一些诊断信息,如操作系统,应用程序环境,线程,native stack本地堆,锁,和内存的信息。在生成heapdump文件的时候...

Global site tag (gtag.js) - Google Analytics