建立最小堆的下滑算法

原创 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++实现)--算法拾遗(1)

现在开始想把平时遇到的零星的算法都记录在这个板块里,因为若是没有平常的记录而只是将曾经实现过的代码烂在文件夹里的话确实不是一个很好的做法啊。毕竟这是笔记而非展示给那个平台下的报告,所以有的时候写的随便...
  • miaote
  • miaote
  • 2016年12月05日 18:59
  • 110

运用并查集与最小堆实现Kruskal算法

前言 Kruskal是在一个图(图论)中生成最小生成树的算法之一。(另外还有Prim算法,之后会涉及到)这就牵扯到了最小生成树的概念,其实就是总权值最小的一个连通无回路的子图。(结合下文的示意图不难...

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

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

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

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

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

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

关于数组TOP K算法(快排及最小堆方式C代码)

TOP K即返回给定集合最大的K个元素,这个集合有可能很大,十亿,有可能万亿,所以对算法的要求比较高。以下是我的总结: 一、采用快速排序的分治算法思想进行求解: 快速排序的思想是使用一个标...
  • Aiphis
  • Aiphis
  • 2015年10月22日 14:01
  • 469

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

首先明确什么是堆? 一个数组: int[] unsort={12,24,35,40,50,66,70,56,55}; 堆的表现形式(这是一个最小堆,根节点是最小的): 用数组来表示堆,i结点的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建立最小堆的下滑算法
举报原因:
原因补充:

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