#include<vector>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 100;
//
int heap[maxn];
int n = 10;
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;//让j存储右孩子下标(j存大的那个的下标)
}
if (heap[j] > heap[i]) {
//孩子中的权大于节点
swap(heap[j], heap[i]);
i = j;
j + i * 2;//保存i为欲调整节点,j为i左孩子
}
else {
break;//孩子的权重均比欲调整节点i小,调整结束
}
}
}
void createHeap() {
for (int i = n / 2; i >= 1; i--) {
//从非叶子节点倒着枚举
downAdjust(i, n);
}
}
void deleteTop() {
heap[1] = heap[n--];//用最后一个元素代替堆顶,然后向下调整。
downAdjust(1, n);
}
//加到最后一个元素位置,然后向上调整。总是与父节点比,比较大的话就换
//堆排序
void heapSort() {
createHeap();//建堆
for (int i = n; i > 1; i--) {//倒着枚举直到堆中只有一个元素
swap(heap[i], heap[1]);//交换hea[i]与堆顶
downAdjust(1, i - 1);//调整堆顶 b
}
}
堆的建立、调整和排序
最新推荐文章于 2024-03-18 13:09:44 发布