建立最小堆的下滑算法

原创 2016年08月28日 15:22:12
//从节点start开始直到m为止,自上向下比较,如果子女的值小于父节点的值,则
//关键码小的上浮,继续向下层比较。
void siftDown(int *a,int start, int m){
	int i = start, j = 2 *i +1;
	int tmp  = a[i];
	while(j<=m){
		if(j<m && a[j]>a[j+1])
			j++;
		if(tmp <=a[j]) 
			break;
		else{
			a[i] = a[j];
			i = j;
			j = 2*j+1;
		}
	}
	a[i] = tmp;
}
void minHeap(int *a, int len){
	int currentSize = len;
	int currentPos = (currentSize-2) / 2;
	while(currentPos>=0){
		siftDown(a, currentPos,currentSize-1);
		currentPos--;
	}
}
<pre name="code" class="cpp">int main(){
	int i,j;
	int a[] = {53,17,78,9,45,65,87,23};
	int len = sizeof(a) / sizeof(int);
	minHeap(a, len);
	for(i = 0; i < len; i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

算法入门--堆排序2(建立最小堆,从大到小)

#include #include int left(int i)//返回左孩子位置 { return 2*i; } int right(int i)//返回右孩子位置 { r...

算法导论第六章之最大、最小堆

堆是很重要的一种数据结构,常常用在排序和优先队列的实现上,当然在C++ STL中有优先队列的实现,但是者并不妨碍我们去学习他。堆其实是一种数组对象,也就是说他的数据全部都存储在数组中,它可以被视为一棵...

算法导论6.5-8习题解答(最小堆K路合并)

《算法导论》第六章第五节的第8题,原题为:请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)。 算...

算法——TOP K问题最小堆实现扩展

概述上文我们讲到TOP K问题最小堆的实现,采用的比较基本数据类型int。这里我们将扩展到比较对象代码实现这里我们直接上代码,这里的扩展最小堆我们取名为ExMinHeap,实现如下package or...

一步一步解析java排序算法--堆排序(最小堆)

首先明确什么是堆? 一个数组: int[] unsort={12,24,35,40,50,66,70,56,55}; 堆的表现形式(这是一个最小堆,根节点是最小的): 用数组来表示堆,i结点的...

【数据结构与算法】最小堆 minheap

最小堆与最大堆实现思路一样,只不过顺序不同,这里只记录最小堆。 最小堆的定义是,一棵完全二叉树,每一个节点都大于等于其父节点。完全二叉树是叶子都在最后一层,且尽量靠左。 实现方面可以使用链表或者数...

堆排序(最小堆)--【算法导论】

堆排序的思想在堆排序(最大堆)已做说明,故不再赘述; 总之,思想就是首先进行建堆,由于这是最小堆,故而必须保证父节点都小于孩子节点,若不满足条件,则进行调节; 最后进行堆排序,不断将最小的提取出来...
  • xjm199
  • xjm199
  • 2014-01-08 21:39
  • 3198

基于邻接表的有回溯最小堆优化的单源最短路Dijkstra算法

前一篇blog的图的存储结构用的邻接矩阵,这篇使用邻接表。不同的数据结构特点也不同,要根据算法需要选出合适的。 图规模比较小时,推荐邻接矩阵; 稠密图推荐用邻接矩阵; 需要快速判断两点间是否右边,推荐...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)