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