堆是一个经常使用数组顺序存储的二叉树,分为最大堆和最小堆两种。以最大堆为例,对于除了根节点之外的每一个结点,至多与其父节点一样大。

MAX_HEAPIFY函数

作用:对于以i结点为根节点的树,它的左右子树都是最大堆,但是i结点不一定是最大元素,调整i结点的位置,使整个树都满足最大堆的性质
这个函数是维护最大堆的关键
复杂度:O(lgn)

//本代码中数列从1开始
void max_heapify(int a[],int i,int n)
{
	int l=2*i,r=2*i+1; 
	int largest=i;
	if(l<=n&&a[l]>a[i])
	  largest=l;
	if(r<=n&&a[r]>a[largest])
	  largest=r;
	if(largest!=i)
	{
		int temp;
		temp=a[i];
		a[i]=a[largest];
		a[largest]=temp;
		max_heapify(a,largest,n);
	}
}

BUILD_MAX_HEAP函数

功能:把一个无序数组变为最大堆
复杂度:O(n)

void build_max_heap(int a[],int n)
{
	int i;
	for(i=n/2;i>=1;i--)
	  max_heapify(a,i,n);
}

堆排序算法HEAP_SORT

功能:排序
思路:先把序列变成最大堆,把最大值根节点跟最末元素换位,该点就应该在这个位置,此后该点不再参与排序(n–)

//从1开始
void heap_sort(int a[],int size)
{
	build_max_heap(a,size);
	int temp;
	for(i=size;i>=2;i--)
	{
		temp=a[1];
		a[1]=a[i];
		a[i]=temp;
		size--;
		max_heapify(a,1,size);
	}
}

HEAP_INSERT

向堆中插入一个元素
此处num为插入后的元素个数

void heap_insert(int a[],int num,int x)
{
	a[num]=x;
	int i,temp;
	for(i=num;i>1&&a[i/2]<a[i];i/=2)
	{
		temp=a[i];
		a[i]=a[i/2];
		a[i/2]=temp;
	}
}

HEAP_DELETE

删除堆中最大的元素(根节点)
此处num为删除后的元素个数

void heap_delete(int a[],int num)
{
	a[1]=a[num+1];
	max_heapify(a,1,num);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值