实验要求:用堆排序算法按关键字递减的顺序排序。
程序输入:待排序记录数(整数)和待排序记录(整数序列);
程序输出:建堆结果和建堆后第一、第二次筛选结果。(注:待排序记录数大于等于3)
测试输入![]() | 期待的输出![]() | 时间限制![]() | 内存限制![]() | 额外进程![]() | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int n,flag=0;
void HeapAdjust(int a[],int s,int m)
{
int rc=a[s]; //rc为需要筛选的值
for(int j=2*s;j<=m;j*=2)
{
if(j<m && a[j]<a[j+1]) ++j; //j为左右孩子中较大的一个
if(rc>=a[j]) break; //筛选完毕,找到插入位置
a[s]=a[j];
s=j;
}
a[s]=rc; //插入
}
void print(int a[],int t)
{
for(int i=1;i<=t;++i) printf("%d ",a[i]);
printf("\n");
}
void HeapSort(int a[])
{
for(int i=n/2;i>0;--i) HeapAdjust(a,i,n); //建成大顶堆
for(int i=n;i>1;--i)
{
print(a,i);
++flag;
if(flag==3) break;
swap(a[1],a[i]);
HeapAdjust(a,1,i-1);
}
}
int main(){
scanf("%d",&n);
int a[n+1];
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
HeapSort(a);
}