自定义结构体:
#define sz 105
typedef struct node{
	int length;
	int l[sz];
}SqList; 
调整堆的函数:
HeapAdjust函数思路说明:
//目标:将以s为根的子树调整为大根堆
//具体操作:将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就“放下”s
void HeapAdjust(SqList &L, int s, int m)//将以s为根的子树调整为大根堆<=>将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就放下s
{
	int rc = L.l[s];
	for(int j = 2*s; j <= m; j *= 2)//j指向s的左子树
	{
		if(j<m && L.l[j] < L.l[j+1] ) j+=1;//j指向s的子树中较大的那个
		if(rc >= L.l[j]) break;//此时接着执行L.l[s] = rc; 便可实现上述目标
		L.l[s] = L.l[j]; s = j;//将路径上比s大的都往上移动,s往下移动
	}
	L.l[s] = rc;
}
void CreateHeap(SqList &L)
{
	int n = L.length;
	for(int i=n/2; i>0; i--)//从n/2向下取整得到的整数所对应的结果开始,依次进行调整堆的操作
	{						//关于为什么从n/2开始: 因为在n/2后面的节点都是叶子结点,不需要调整
		HeapAdjust(L, i, n);
	}
} 
完整代码:
#include<bits/stdc++.h>
using namespace std;
#define sz 105
typedef struct node{
	int length;
	int l[sz];
}SqList;
void HeapAdjust(SqList &L, int s, int m)//将以s为根的子树调整为大根堆<=>将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就放下s
{
	int rc = L.l[s];
	for(int j = 2*s; j <= m; j *= 2)//j指向s的左子树
	{
		if(j<m && L.l[j] < L.l[j+1] ) j+=1;//j指向s的子树中较大的那个
		if(rc >= L.l[j]) break;//此时接着执行L.l[s] = rc; 便可实现上述目标
		L.l[s] = L.l[j]; s = j;//将路径上比s大的都往上移动,s往下移动
	}
	L.l[s] = rc;
}
void CreateHeap(SqList &L)
{
	int n = L.length;
	for(int i=n/2; i>0; i--)//从n/2向下取整得到的整数所对应的结果开始,依次进行调整堆的操作
	{						//关于为什么从n/2开始: 因为在n/2后面的节点都是叶子结点,不需要调整
		HeapAdjust(L, i, n);
	}
}
int main()
{
	SqList L;
	L.length = 0;
	srand(time(NULL));//随机数种子
	for(int i=1; i<=100; i++)
	{
		int rand_int = rand()%100;//生成0 ~ 99的随机整数
		L.l[i] = rand_int;
		cout<<rand_int<<" "; 
		L.length++;
	}
	CreateHeap(L);
	cout<<"\n"<<"after Adjustment: "<<endl;
	for(int i=1; i<=L.length; i++ )
	{
		cout<<L.l[i]<<" ";
	}
	return 0;
} 
运行结果示例:

~希望对你有帮助~

















