建立二叉堆(STL练习)

二叉堆的建立

算是对STL的一道练习题

思想:
1.建立向量a,输入测试数据
2.基于数组下标,判断当前堆顶是否已满足要求

Code:

#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;
// 传入数组a和下标i,i的左右子树都满足最大堆的性质,函数将a整体调整为最大堆 
void heap_down(std::vector<int>&a, int i){
	while( i < a.size()){// 只要i不超过数组长度,就不断向下调整 
		int left = 2*i+1;// 计算i的左子节点下标 
		int right = 2*i+2;// 计算i的右子节点下标 
		int maximum = i;// 设置maximum存储i和左右子节点较大节点的下标,初始化为i 
		// 如果左子树存在且a[maximum]小于a[left] 
		if(left < a.size()&&a[maximum] < a[left]){
			maximum = left;// 更新maximum为left 
		}
		// 如果右子树存在且a[maximum]小于a[right] 
		if(right < a.size()&&a[maximum] < a[right]){
			maximum = right;// 更新maximum为right 
		}
		if(maximum == i){// 如果此时maximum	仍等于i 
			break;// 说明a[i]比左右子节点都大,后面就不需要再调整了,跳出循环 
		}
		// 交换a[i]和a[maximum]
		int temp = a[i];
		a[i] = a[maximum];
		a[maximum] = temp;
		i = maximum;// 将i指向maximum,继续向下调整
	}
}
// 建堆可以调用heap_down来实现 
void make_heap(vector<int>&a){
	for(int i = a.size()-1; i >= 0; i--){
		heap_down(a,i);// 从后向前调用heap_down调整数组a的每个元素 
	}
}

int main()
{
	vector<int> a;
	a.push_back(5);
	a.push_back(2);
	a.push_back(3);
	a.push_back(6);
	a.push_back(7);
	printf("make_heap default(bigheap):\n");
	// 默认情况下,调用make_heap
	// 将向量a建立为最大堆 
	make_heap(a.begin(),a.end());
	for(int i = 0; i < a.size(); i++){
		printf("a[%d]=%d ",i,a[i]);
	}
	// 当传入的Compare是gerater时,创建最小堆 
	printf("\nmake_heap greater<int>(smallheap):\n");
	make_heap(a.begin(),a.end(),greater<int>());
	for(int i = 0; i < a.size(); i++){
		printf("a[%d]=%d ",i,a[i]);
	}
	// 当传入的Compare是less时,创建最大堆
	printf("\nmake_heap less<int>(bigheap):\n");
	make_heap(a.begin(),a.end(),less<int>());
	for( int i = 0; i < a.size(); i++){
		printf( "a[%d]=%d ", i, a[i]);
	} 
	return 0;
}

此段代码非原创代码,仅供学习交流用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值