#include<iostream>
using namespace std;
//a[0]空出来,辅助空间
int a[10] = { NULL,10,3,6,23,44,56,99,1,21 };
void HeadAdjust(int a[], int k, int len);
void buildMAXHeap(int a[], int len);
void swap(int& a, int& b);
void Headsort(int a[], int len);
//建立大根堆
void buildMAXHeap(int a[], int len) {
//从最后一个非叶结点开始
for (int i = len / 2; i >= 1; i--) {
HeadAdjust(a, i, len);
}
}
//调整以k为跟的子树
void HeadAdjust(int a[], int k, int len) {
a[0] = a[k];//保存根节点
for (int i = 2 * k; i <= len; i = 2 * i) {//左孩子为2i
if (i < len && a[i] < a[i + 1])//找到大孩子下标
i++;
if (a[0] >= a[i]) break;//还是原来的根节点大
else {
a[k] = a[i];
//a[i] = a[0];有break的情况,不能这么写
k = i;
}
a[k] = a[0];
}
//a[k] = a[0];????
}
void swap(int& a, int& b) {
int c = a;
a = b;
b = c;
}
void Headsort(int a[], int len) {
buildMAXHeap(a, len);
for (int i = len; i > 1; i--) {
swap(a[1], a[i]);
HeadAdjust(a, 1, i - 1);
}
}
int main() {
buildMAXHeap(a, 9);
for (int i = 1; i < 10; i++)
cout << a[i] << " ";
cout << endl;
//int x = 20, y = 30;
//swap(x, y);
//cout << x << endl;
Headsort(a, 9);
//这里传入的数是数组实际有多少个数字
for (int i = 1; i < 10; i++)
cout << a[i] << " ";
return 0;
}
23王道大堆顶
最新推荐文章于 2025-06-06 21:33:25 发布