#include<iostream>
using namespace std;
/*
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
*/
const int SIZE_ARRAY = 101;
int heap[SIZE_ARRAY] = {0}; // 堆中元素
int n;//堆中元素个数
//交换函数
void heapSwap(int x, int y) {
int temp = heap[x];
heap[x] = heap[y];
heap[y] = temp;
}
//向下调整函数
void siftDown(int i)
{//传入一个需要向下调整的节点编号
int t, flag = 0;//flag 标记师傅需要向下调整
//当i节点有儿子,并且需要继续调整就执行
while (i * 2 <= n && !flag)
{
//首先判断他和左儿子的关系,并用t记录较大值的节点编号
if (heap[i] < heap[i * 2])
{
t = i * 2;
}
else
{
t = i;
}
//如果有右儿子
if (i * 2 + 1 <= n)
{
if (heap[t] < heap[i * 2 + 1])
{
t = i * 2 + 1;
}
}
if (t != i)
{
heapSwap(t, i);
i = t;
}
else
{
flag = 1;
}
}
}
//建立堆的函数
void creatHeap()
{
int i;
//从最后一个非叶节点到第1个节点依次进行向上调整
for (i = n / 2; i >= 1; i--)
{
siftDown(i);
}
}
//堆排序
void heapSort()
{
while (n > 1)
{
heapSwap(1, n);
n--;
siftDown(1);
}
}
//删除最大元素
int deleteMin()
{
int t = heap[1];//记录堆顶元素
heap[1] = heap[n];//将堆最后一个元素赋值到堆顶
n--;//堆元素减一
siftDown(1);//向下调整
return t;//返回之前堆顶的最小值
}
int main(void)
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> heap[i];
}
int num = n;
//建堆
creatHeap();
//堆排序
heapSort();
cout << deleteMin() << endl;
for (int i = 1; i <= num; i++)
{
cout << heap[i] << " ";
}
cout << endl;
return 0;
}
建堆及堆排序
最新推荐文章于 2023-05-28 11:19:59 发布