最大堆排序
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
const int MAX = 0x3f3f3f3f;
const int maxn = 1000;
typedef struct HeapStruct *MaxHeap;
struct HeapStruct {
int data[maxn];
int Size;
int Capacity;
};//堆
MaxHeap Creat(int maxsize)//建最大堆
{
MaxHeap H =(MaxHeap)malloc(sizeof(struct HeapStruct));
H->Size=0;
H->Capacity=maxsize;
H->data[0]=MAX;
return H;
}
int IsFull(MaxHeap H)//判断堆是否为满
{
if(H->Size==H->Capacity)return 1;
else return 0;
}
int IsEmpty(MaxHeap H)//判断堆是否为空
{
if(H->Size != 0 )return 0;
else return 1;
}
void Insert(MaxHeap H ,int x)//插入
{
int i;
if(IsFull(H)){
printf("It is full");
return ;
}
i=++H->Size;
for (;H->data[i/2]<x;i/=2){
H->data[i]=H->data[i/2];
}
H->data[i]=x;
}
int DelectMax(MaxHeap &H)//取出
{
int p,c,maxitem,temp;
if (IsEmpty(H)){
printf("It is empty");
return 0;
}
maxitem=H->data[1];
temp=H->data[H->Size--];
for (p=1;p*2<=H->Size;p=c)
{
c=p*2;
if((c!=H->Size)&&(H->data[c]<H->data[c+1]))
c++;
if (temp>=H->data[c])break;
else H->data[p]=H->data[c];
}
H->data[p]=temp;
return maxitem;
}
int main(){
int n,s,sum=1;
//freopen("C:/Users/111/Desktop/text/input.txt", "r", stdin);
//freopen("C:/Users/111/Desktop/text/output.txt", "w", stdout);
while(~scanf("%d",&n),n!=-1){
int a[maxn];
MaxHeap H;
H=Creat(maxn);
for (int i = 0 ; i < n ; ++i){
scanf("%d",&s);
Insert(H,s);
}
printf("Case%d:%d\n",sum,n);
for (int i = 0 ; i < n ; ++i){
a[i]=DelectMax(H);
}
for (int i = n-1 ; i >=0 ;--i){
printf("%d ",a[i]);
}
printf("\n");
sum++;
}
//fclose(stdin);//关闭重定向输入
//fclose(stdout);//关闭重定向输出
return 0;
}