题目描述
给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。
输入
数据个数n,n个整数数据
输出
初始创建的小顶堆序列
每趟交换、筛选后的数据序列,输出格式见样例
输入输出样例
输入样例1 <-复制
8 34 23 677 2 1 453 3 7
输出样例1
8 1 2 3 7 23 453 677 34
8 2 7 3 34 23 453 677 1
8 3 7 453 34 23 677 2 1
8 7 23 453 34 677 3 2 1
8 23 34 453 677 7 3 2 1
8 34 677 453 23 7 3 2 1
8 453 677 34 23 7 3 2 1
8 677 453 34 23 7 3 2 1
分析
根据下图伪代码coding即可,注意图示是大顶堆,题目是小顶堆,图源:b站王道考研。
AC代码
#include<iostream>
using namespace std;
int n;
int zu[100]; //从1开始
void show()
{
cout << n << " ";
int i;
for (i = 1; i <= n; i++)
{
cout << zu[i];
if (i != n)
cout << " ";
else
cout << endl;
}
}
void heapadj(int qi,int len)
{
zu[0] = zu[qi];
for (int i = qi * 2; i <= len; i *= 2)
{
if (i<len && zu[i]>zu[i + 1])
i++;
if (zu[0] <= zu[i])
break;
swap(zu[qi], zu[i]);
qi = i;
}
}
void buildheap()
{
for (int i = n / 2; i > 0; i--)
heapadj(i,n);
}
void heapsort()
{
buildheap();
show();
for (int i = n; i > 1; i--)
{
swap(zu[i], zu[1]);
heapadj(1,i-1);
show();
}
}
int main()
{
cin >> n;
int i;
for (i = 1; i <= n; i++)
cin >> zu[i];
heapsort();
}
(by 归忆)