
小根堆




如何将树调整成堆呢?
将破坏堆序性的元素和他的最大的子结点比较,如果小于则进行交换


现在就是只有树的最后一个元素破坏了堆序性
方法:将他和他的父元素比较,若大于父节点则进行交换,直到无法上移为止
问题:如果有一个乱序的数组如何进行建堆呢?
有两种方法:自下而上和自上而下
方法:
将新元素放到堆的最后一位,然后进行上滤操作
两种操作 :一个是插入队列,一个是弹出最小元素

一般使用小根堆来实现,弹出之后需要调整操作‘
方法:
将最后一个元素放到根节点,然后进行下滤操作
插入操作:上滤操作就是插入操作



#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1000 + 1;
int heap[MAXN];
void downAdjust(int low, int high) {
int i = low, j = i * 2;
while (j <= high) {
if (j + 1 <= high && heap[j + 1] > heap[j]) {
j = j + 1;
}
if (heap[j] > heap[i]) {
swap(heap[j], heap[i]);
i = j;
j = i * 2;
}
else {
break;
}
}
}
void createHeap(int n) {
for (int i = n / 2; i >= 1; i--) {
downAdjust(i, n);
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &heap[i]);
}
createHeap(n);
for (int i = 1; i <= n; i++) {
printf("%d", heap[i]);
if (i < n) {
printf(" ");
}
}
return 0;
}