#include<cstdio>
#include<algorithm>
// for test
#include<queue>
using namespace std;
// 学习堆的代码
// 建立堆
// 堆使用数组表示
const int maxn = 100;
// 0 不存储元素,1开始存储元素
// i * 2 为左孩子, i * 2 + 1 为右孩子
int heap[maxn] = {
0};
int n = 0; // n为元素个数
// 下调整代码,以堆顶一个元素为中心,往下调整
// 需要保证中心元素的左右子树的根节点都是子树中的最大值
// 用于堆排序和取堆顶元素,建立堆时也可以使用
void down_adjust(int low, int high){
int i = low, j = i * 2; // i为父亲节点,j暂时指向其左孩子
while(j <= high){
// 存在孩子节点
// 如果左右节点都有的话,j指向左右节点中最大的
if(j + 1 <= high && heap[j] < heap[j + 1]){
j = j + 1;
}
// 向下调整开始
if(heap[i] < heap[j]){
swap(heap[i], heap[j]);
i = j;
j = i * 2;
} else{
【机试练习】【C++】堆练习
最新推荐文章于 2024-04-22 12:48:38 发布