```问题描述
对于任一无序正整数序列,写一程序用堆排序算法将其排序成按值非递减有序序列。
输入描述
文本文件“input.txt”中保存了n个测试用例,文件以-1结束。每个用例的第一行m表示待排序正整数序列的元素个数,第二行为该序列的m个正整数。
输出描述
输出结果保存在文本文件“output.txt”中。对于每个测试用例均有二行输出,第一行输出“Case #:##”,#表示用例的编号(1…n),##表示排序后有序序列的元素个数,第二输出##个按值非递减有序元素。
代码如下:
```c
#include<stdio.h>
#include <stdlib.h>
#define MinData 0;
typedef int ElementType;
typedef struct HeapStruct* MinHeap;
struct HeapStruct{
ElementType *Elements;
int Size;
int Capacity;
};
MinHeap Create(int MaxSize)
{
MinHeap H = (MinHeap)malloc(sizeof(struct HeapStruct));
H->Elements=(int*)malloc(sizeof(int)*(MaxSize+1));
H->Size = 0;
H->Capacity = MaxSize;
H->Elements[0]=MinData;
return H;
}
//插入元素
void Insert(MinHeap H,ElementType item)
{
int i;
if(H->Size == H->Capacity){
return;
}
i=++H->Size;
for(;H->Elements[i/2]<item;i/=2){
H->Elements[i]=H->Elements[i/2];
}
H->Elements[i]=item;
}
//取出最小值,并删除节点
ElementType DeleteMin(MinHeap H)
{
int Parent,Child;
ElementType Minitem,temp;
Minitem=H->Elements[1];//取出根节点的最小值
temp=H->Elements[H->Size--];//用最小堆中最后一个元素从根节点开始向上过滤下层节点
for(Parent=1;Parent*2<H->Size;Parent=Child){
Child=Parent*2;
if((Child!=H->Size) && (H->Elements[Child]>H->Elements[Child+1])) {
Child++;
if(temp < H->Elements[Child]) break;
else{
H->Elements[Parent]=H->Elements[Child];
}
}
}
H->Elements[Parent]=temp;
return Minitem;
}
int main()
{
FILE *fp=fopen("D://input.txt","r");
FILE *fo=fopen("D://output.txt","w");
MinHeap H;
int MaxSize=0;
int dat=0;
int i=0;
while(1){
fscanf(fp,"%d",&MaxSize);
if(MaxSize==-1) break;
H=Create(MaxSize);
for(int j=0;j<MaxSize;j++){
fscanf(fp,"%d",&dat);
Insert(H,dat);
}
fprintf(fp,"Case %d : %d\n",i+1,MaxSize);
for(int k=0;k<MaxSize;k++){
fprintf(fo,"%d ",DeleteMin(H));
}
i++;
fprintf(fo,"\n");
free(H);
}
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。