`
剑锋无刃
  • 浏览: 34048 次
  • 性别: Icon_minigender_1
  • 来自: 长沙市
最近访客 更多访客>>
社区版块
存档分类
最新评论

6.堆

阅读更多

1、堆数据结构是一种数组对象。

2、该数组对象的两个属性:

length【A】数组元素的个数

heap-size【A】存放在A中的堆的元素个数

3、父节点与其左右子节点的关系:

父节点:parent(i)

return i/2;

             左子节点:getLeftChild(i)

return 2*i+1;

     右子节点:getRightChild(i)

return 2*i+2;

4、最大堆的特性:(堆排序)

A[PARENT(i)]>=A[i];

     最小堆的特性:(优先队列)

A[PARENT(i)]<=A[i];

5、堆排序:

      1.建堆:

Build_heap(A)

heap_size(A)<--length[A]

for i<--取整[length[A]/2]-1

do Max_heapify(A,i)

      2.调整堆:

Max_heapify(A,i)

left<-getLeftChild(i)

right<-getRightChild(i)

if left<=heap_size[A]&&A[left]>A[i]

then largst<-left

else  largst<-i

                if right<=heap_size[A]&&A[right]>A[i]

then largst<-right

if largst != i

then exchange A[i]<-->A[largst]

Max_heapify(A,largst)

 

      3.堆排序:

HeapSort(A)

Build_heap(A)

for i<--length[A]-1

do exchange A[0]<---heap_size[A]-1

Max_heapify(A,i)

6、Java代码实现:

public class HeapSort
{
	/**
	 * 堆排序的方法
	 * @param array
	 */
	public static void heapSort(int a[],int alen)
	{
		int hlen=alen;
		int temp;
		//1、建堆
		BuildHeap(a,hlen);
		
		for(int i=alen-1;i>=0;i--)
		{
			temp=a[0];//将数组的最后一个元素与第一个元素交换
			a[0]=a[i];
			a[i]=temp;
			hlen--;       //堆长度减1
			Max_HeapIFY(a,hlen,0);//调整堆
		}
		
	}
	/**
	 * 建堆的方法
	 */
	public static void BuildHeap(int a[],int hlen)
	{
		int begin=hlen/2-1;
		for(int i=begin;i>=0;i--)
		{
			Max_HeapIFY(a,hlen,i);	
		}
	}
	/**
	 * 调整堆的方法
	 */
	public static void Max_HeapIFY(int a[],int hlen,int i)
	{
		int left=getLeftChild(i);
		int right=getRightChild(i);
		int largst =i;
		int temp;
		
		if(left<hlen&&a[largst]<a[left])
		{
			largst=left;
		}
		if(right<hlen&&a[largst]<a[right])
		{
			largst=right;
		}
		if(i!=largst)
		{
			temp=a[largst];   //将值最大的数与当前数交换
			a[largst]=a[i];
			a[i]=temp;
			//在获取当前的左右孩子节点
			Max_HeapIFY(a,hlen,largst);
		}
	}
	/**
	 * 获取左孩子节点
	 */
	public static int getLeftChild(int i)
	{
		return 2*i+1;
	}
	public static int getRightChild(int i)
	{
		return 2*i+2;
	}
	
	public static void main(String[] args)
	{
		int a[]={16,4,10,14,7,9,3,2,8,5,1,5,33,45,323,2323,876};
		int alen=a.length;
		//未排序的顺序
		System.out.println("未排序时,数组元素的顺序:");
		for(int i=0;i<alen;i++)
		{
			System.out.print(a[i]+"  ");
		} 
		System.out.println();
		System.out.println("排序后,数组元素的顺序:");
		heapSort(a,alen);
		//排序后的顺序
		for(int i=0;i<alen;i++)
		{
			System.out.print(a[i]+"  ");
		}
		System.out.println();
		System.out.println("数组中最大的十个数为:");
		for(int i=alen-1;i>=alen-10;i--)
		{
			System.out.print(a[i]+"  ");
		}	
	}
}
 
分享到:
评论

相关推荐

    Java排序算法练习:1.快速排序 2.归并排序 3.插入排序 4.冒泡排序 5.选择排序 6.堆排序

    6. **堆排序**:利用二叉堆数据结构实现的排序算法。堆排序首先将数组构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,调整剩余元素为新堆,重复此过程,直至整个数组排序完成。堆排序的时间复杂度为O(n ...

    堆排序6.py 使用python实现

    堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现...

    简单易懂的堆叠技术介绍.doc

    6. 堆叠+LAG 结合使用可以提高设备级的可靠性。 7. 堆叠+LAG 结合使用也可以增加链路带宽,避免单线路故障和转发延迟。 堆叠技术的缺点包括: 1. 故障率高,单主控板出现问题,可能会导致备份主控板无法接管的问题...

    华为交换机堆叠配置文件

    6. 堆叠配置举例 堆叠配置举例包括组网需求、配置思路、配置过程等。例如,在组网中需要实现高可靠性和高带宽的数据转发,可以使用堆叠配置来实现。 7. 堆叠的应用场景 堆叠的应用场景包括:提高可靠性、扩展端口...

    堆排序总结 堆排序总结

    #### 6. 堆排序算法实现 以下是一个简单的堆排序算法实现的伪代码: ```plaintext function heapSort(arr): n = length(arr) // 构建大根堆 for i from n/2 downto 1: heapify(arr, n, i) // 一个个从堆顶...

    c语言实现 小根堆heap

    6. 堆排序(Heapsort):小根堆可以用于实现高效的排序算法——堆排序。首先,构造一个小根堆,然后反复将堆顶元素(最小元素)与末尾元素交换,再调整堆,直至所有元素都在堆中正确排序。 7. 堆的优化:在实际应用...

    面试求职必会算法——树和堆

    6. 堆在实际问题中的应用,如优先队列和Top-K问题。 通过学习和掌握这些知识,你将能够自信地面对面试中关于树和堆的挑战,提升你的求职竞争力。同时,实践编程练习和解决实际问题也是巩固理论知识的关键。

    以太网链路聚合与交换机堆叠、集群.doc

    6.堆叠技术的目的和应用场景 7.VRRP 技术的概念和应用场景 详细说明: 以太网链路聚合是指将多个物理接口捆绑成为一个逻辑接口,以达到增加链路带宽的目的。这项技术可以解决单点故障问题,避免因某个链路或者某个...

    堆排序算法(严蔚敏数据结构)

    6. 堆排序的优势与局限: - 优势:堆排序的时间复杂度较低,对于大数据量的排序效率较高,且空间复杂度低,适合原地排序。 - 局限:堆排序不是稳定的排序算法,相等的元素可能会改变原有的相对顺序。此外,由于...

    常用的十种java排序算法实现

    1. 冒泡排序(Bubble Sort) ...6.堆排序(Heap Sort) 7. 计数排序(Counting Sort) 8. 桶排序(Bucket Sort) 9. 基数排序(Radix Sort) 10. 希尔排序(Shell Sort) 解压密码 douge

    有机固体废物堆肥原理理论与实践PPT学习教案.pptx

    6. 堆肥化过程的阶段: 堆肥化过程大致可分为四个阶段:潜伏阶段(微生物适应期)、中温阶段(约45℃以下,主要分解易降解有机物)、高温阶段(45℃以上,降解纤维素等难降解物质,杀死病原体)和降温腐熟阶段...

    基础排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序.zip

    **6. 堆排序** 堆排序利用了堆这种数据结构。首先构建一个大顶堆(或小顶堆),然后将堆顶元素与末尾元素交换,再调整堆,如此反复,直到所有元素排序完成。堆排序的时间复杂度为O(n log n),且是稳定的排序算法。 ...

    BravedBoy#YCBlogs#07.堆排序1

    1.基本思想 2.排序过程 3.代码实现 4.如何优化 5.复杂度 6.使用场景 1.基本思想 2.排序过程 1.先将初始文件R[1..n]建成一个大根堆,此堆

    数据结构(严蔚敏_吴伟民_C语言版).2007版.扫描版.rar

    6. 堆:是一种特殊的完全二叉树,满足堆属性,即父节点的值总是大于或等于(最小堆)或小于或等于(最大堆)其子节点的值。堆常用于优先队列的实现。 7. 散列表(哈希表):通过哈希函数将键映射到数组的索引上,...

    Sort_and_Search.zip_Sort_and_Search.zip

    6. 堆排序:利用堆数据结构,维护一个最大堆或最小堆,每次取出堆顶元素并调整堆,时间复杂度为O(n log n)。 7. 计数排序、基数排序和桶排序:这些是非比较型排序,适用于特定类型的输入数据,如整数或范围有限的值...

    archive_Java算法大全(近100种算法打包).zip.zip

    6. 堆排序:利用堆结构进行排序,时间复杂度为O(nlogn)。 7. 计数排序、桶排序、基数排序等线性时间复杂度的非比较排序算法,适用于特定场景。 二、查找算法 查找算法用于在数据集合中寻找特定元素: 1. 线性查找:...

    ACMer需要掌握的算法讲解.pdf

    6. 堆:如优先队列的实现。 7. Trie树:用于字符串查找,分为静态建树和动态建树,如POJ2513。 四、简单搜索 1. 深度优先搜索(DFS):如POJ2488。 2. 广度优先搜索(BFS):如POJ3278。 3. 搜索技巧和剪枝:优化...

    java虚拟内存.pdf

    6. 堆内存的调整: - 初始堆大小(-Xms):JVM启动时设置的堆内存大小。 - 最大堆大小(-Xmx):JVM允许的最大堆内存大小。 - 对于64位JVM,堆内存大小可以设置为4GB,Windows下推荐设置为1.5G-2G,Linux下为2G-...

    heapview.zip

    6. 堆内存比较:对比不同时间点或不同条件下的堆内存状态,找出差异。 使用heapview插件,开发者可以在不离开IDEA的环境下进行内存诊断,节省了在外部工具和IDE之间切换的时间,提高了工作效率。对于大型或复杂项目...

    北大acm试题分类.doc

    6. 堆:如 poj2299。 7. trie 树:用于字符串搜索,如 poj2513。 四、简单搜索: 1. 深度优先搜索:如 poj2488。 2. 广度优先搜索:如 poj3278。 3. 搜索技巧与剪枝:提高搜索效率,如 poj2531。 五、动态规划: 1...

Global site tag (gtag.js) - Google Analytics