堆操作

#include <stdio.h>
#define SWAP(a,b) temp=a;a=b;b=temp
int temp;
void sift_up(int a[],int i)            //元素上移
{
    while((i!=1)&&(a[i/2]<a[i]))
    {
        SWAP(a[i/2],a[i]);
        i=i/2;
    }
}
void sift_down(int a[],int n,int i)    //元素下移
{
    while(2*i<=n)
    {
        i=2*i;
        if((i+1<=n)&&(a[i+1]>a[i]))
            i=i+1;
        if(a[i/2]<a[i])
            SWAP(a[i/2],a[i]);
    }
}
void insert(int a[],int *n,int x)    //元素的插入
{
    *n=*n+1;
    a[*n]=x;
    sift_up(a,*n);
}
void delete(int a[],int *n,int i)    //删除元素
{
    int x=a[i],y=a[*n];
    SWAP(a[i],a[*n]);
    *n=*n-1;
    if(y>x)
        sift_up(a,i);
    else sift_down(a,*n,i);
}
int delete_max(int a[],int *n)      //取最大值
{
    int max=a[1];
    delete(a,n,1);
    return max;
}
void make_heap(int a[],int b[],int n)
{
    int i,*m=0;
    for(i=0;i<n;i++)
        insert(b,m,a[i]);
}
int main(int argc, const char * argv[])
{
    int n=11;
    int *p;
    p=&n;
    int a[11]={0,25,20,15,13,18,8,3,5,4,2};
    int b[11]={0};
    make_heap(a,b,10);
    for(int i=0;i<11;i++)
    printf("%d",b[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_31631167/article/details/51178804