最小堆

#include<stdio.h>
#include<stdlib.h>
typedef struct HNode * Heap;
struct HNode
{
    int * Data;
    int Size;
    int Capacity;
};
typedef Heap MinHeap;

//最小堆的創建
#define MINDATA -1
MinHeap CreateHeap(int MaxSize)
{
    MinHeap H = (MinHeap)malloc(sizeof(struct HNode));
    H->Data = (int *)malloc ((MaxSize+1)*sizeof(int));
    H->Size=0;
    H->Capacity=MaxSize;
    H->Data[0]=MINDATA;

    return H;
}

//最小堆的插入

bool IsFull(MinHeap H)
{
    return (H->Size==H->Capacity);
}

bool Insert(MinHeap H,int X)
{
    int i;
    if(IsFull(H))
    {
        return false;
    }
    i=++H->Size;
    for(; H->Data[i/2]>X; i/=2)
    {
        H->Data[i]=H->Data[i/2];
    }
    H->Data[i]=X;
    return true;
}

//最小堆的刪除
#define ERROR -1
bool IsEmpty(MinHeap H)
{
    return (H->Size==0);
}

void DeleteMin(MinHeap H)
{
    int  Parent,Child;
    int MaxItem,X;
    if(IsEmpty(H))
    {
        return;
    }
    X=H->Data[H->Size--];
    for(Parent=1; Parent*2<=H->Size; Parent=Child)
    {
        Child=Parent*2;
        if((Child!=H->Size)&&(H->Data[Child]>H->Data[Child+1]))
            Child++;
        if(X<=H->Data[Child])
            break;
        else
        {
            H->Data[Parent]=H->Data[Child];
        }
    }
    H->Data[Parent]=X;
}
void siftdown(MinHeap H,int i)
{
    int t,f=0;
    while(i*2<=H->Size&&!f)
    {
        if(H->Data[i]>H->Data[i*2])t=i*2;
        else t=i;
        if(i*2+1<=H->Size)
        {
            if(H->Data[t]>H->Data[i*2+1])t=i*2+1;
        }
        if(t!=i)
        {
            int x=H->Data[t];
            H->Data[t]=H->Data[i];
            H->Data[i]=x;
            i=t;
        }
        else f=1;
    }
}

int main()
{
    MinHeap mp = CreateHeap(1000);
    MinHeap mmm = CreateHeap(1000);
    int n,m;
    scanf("%d %d",&n,&m);
    int M=m;
    while(m--)
    {
        int a;
        scanf("%d",&a);
        if(a==1)
        {
            int z;
            scanf("%d",&z);
            Insert(mp,z);
        }
        else
            DeleteMin(mp);
            if(mp->Size>n)mp->Size=n;
        for(int i=1; i<=mp->Size; i++)
        {
            if(i==1)
                printf("%d",mp->Data[i]);
            else
                printf(" %d",mp->Data[i]);
        }
        printf("\n");
    }
    scanf("%d",&M);
    for(int i=1; i<=M; i++)
    {
        int z;
        scanf("%d",&z);
        mmm->Data[i]=z;
    }
    mmm->Size=M;
    for(int i=M/2;i>=1;i--) siftdown(mmm,i);
    if(mmm->Size>M)mmm->Size=M;
    for(int i=1; i<=mmm->Size; i++)
    {
        if(i==1)
            printf("%d",mmm->Data[i]);
        else
            printf(" %d",mmm->Data[i]);
    }
    printf("\n");


    return 0;
}
發佈了120 篇原創文章 · 獲贊 5 · 訪問量 4852
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章