最小堆的上调整和下调整

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
const int MAX=50;
using namespace std;

int h[MAX];
int N=10;//长度 

void sifup(int i)
{
	if(i==1)
	{
		return;
	}

	while(i/2!=0)
	{
		if(h[i]<h[i/2])//小于父节点 //上浮
		{
			swap(h[i],h[i/2]);
		}
		else //等于父节点 或是 大于父节点 不需要操作
		{
			return;
			//break;
		}

		i/=2;

	}

}

void sifdown(int i)//向下调整
{
	if(i*2>=N)//大于长度  已到叶子结点 不用调整
	{
		return;
	}

	if(h[i]<h[i/2])//小于父节点 向上调整
	{
		sifup(i);
		return;
	}

	if(h[i]<h[i*2] && h[i]<h[i*2+1])//父节点小于左右结点
	{
		return; //不用调整
	}

	//+++++++++++++++++++++++++++++++此时父节点一定大于左右结点
	int r,l,k;//左右两个结点的下标
	l=i*2; r=i*2+1;

	k=h[l]>h[r]?r:l;//选出最小的结点的下标
    //cout<<k<<endl;
	swap(h[k],h[i]);

	sifdown(k);

}

int main()
{
	for(int i=1;i<=10;i++)
	{
		h[i]=rand()%20;
		sifup(i);
	}

	for(int i=1;i<=10;i++)
	{
		cout<<h[i]<<" ";
	}cout<<endl;

	h[1]=100;
	sifdown(1);

	for(int i=1;i<=N;i++)
	{
		cout<<h[i]<<" ";
	}cout<<endl;

	return 0;
}

  

时间: 2024-10-18 02:29:04

最小堆的上调整和下调整的相关文章

【坐在马桶上看算法】算法12:堆——神奇的优先队列(下)

接着上一Pa说.就是如何建立这个堆呢.可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入(转移到堆中为止).因为插入第i个元素的所用的时间是O(log i),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下. n=0; for(i=1;i<=m;i++) {     n++;     h[ n]=a[ i];  //或者写成scanf("%d",&h[ n]);     siftup(); } 其实我们还有更快得方法来建立堆.它是这样的. 直接

[转]AIX下调整分区大小

AIX下调整文件系统大小 - [work] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://wangsuiri.blogbus.com/logs/35448074.html AIX下调整文件系统大小我们在安装软件的过程中,常常发现现有的分区不够大或者在添置了一块新硬盘的时候新增空间还未被利用起来,这个时候就需要调整分区的大小.这个过程的做法一般如下: 1.首先确定你正使用的卷组=============================================

在Linux下调整启动器位置

最近在微信公众号看到一个比较喜欢的小东西 即在终端下输入 gsettings set com.canonical.Unity.Launcher launcher-position Bottom 启动器的位置自动会调整到下端 gsettings set com.canonical.Unity.Launcher launcher-position Left 则会恢复成原来的样子 具体见截图 在此很感谢公众号<Linux中国> 以上摘自其中文章"十招让Ubuntu16.04 LTS用起来更得心应手"

Linux下调整磁盘大小后的基于LVM的磁盘扩容

Linux下调整磁盘大小后进行分区在线扩容,前提基于LVM不添加新的LV(哎强迫症又犯了)主要用在: 挂载SAN的分区增加LUN的容量后相应的增加系统分区的容量 虚拟机中的磁盘容量增加后相应的增加系统分区的容量 假设被调整的磁盘是/dev/sda,以lvm安装centos,采用系统默认的分区,系统原有情况 PV:/dev/sda3 VG:/dev/centos-test LV:/dev/centos-test/root和/dev/centos-test/swap STEP1 使用parted调整

最小堆的建立 插入 与删除

堆是完全二叉树,完全二叉树最大的特点就是 把数据储存在数组里 通过父子结点的关系来做  不用实际建树  parent=leftchild/2: leftchild=2*parent  右就加1这儿指的是序号关系,储存的时候注意是利用树的逻辑图 从上到下 从左到右编号12345..... 建堆:实际是把数据先放入数组(注意下标从1开始),对应逻辑图,写调整代码,我的基本思路是从数组末尾开始,对应元素与其父节点比较,满足条件就换值,并且对被换的调用调整函数(要单独写个调整函数)因为被换的一个是可能不

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres

【啊哈!算法】算法12:堆——神奇的优先队列(下)

接着上一Pa说.就是如何建立这个堆呢.可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入(转移到堆中为止).因为插入第i个元素的所用的时间是O(log i),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下. n=0; for(i=1;i<=m;i++) { n++; h[ n]=a[ i]; //或者写成scanf("%d",&h[ n]); siftup(); } 其实我们还有更快得方法来建立堆.它是这样的. 直接把99.5.36.7.22

优先队列及最小堆最大堆

为什么优先队列里默认是堆(heap)实现,默认是优先级高的出队,定义结构体重载函数为什么要按照从小到大排序?原来是自己对优先队列还不太了解: 1 堆 1.1 简介 n个关键字序列Kl,K2,-,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号.//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子 若将此序列所存储的向量R[1..n]看做是一

堆——神奇的优先队列(下)

接着上一Pa说.就是如何建立这个堆呢.可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入(转移到堆中为止).因为插入第i个元素的所用的时间是O(log i),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下. n=0; for(i=1;i<=m;i++) { n++; h[ n]=a[ i]; //或者写成scanf("%d",&h[ n]); siftup(); } 其实我们还有更快得方法来建立堆.它是这样的. 直接把99.5.36.7.22