您的位置:首页 > 其它

二叉堆

2016-06-23 11:20 246 查看
               二叉堆



/**** **** **** **** **** ****

*    Function Name :  二叉堆

*    Description :        父结点的键值总是大於或等於任何一个子节点的键值

*                                 便於寻找父节点和子节点    

**** **** **** **** **** ****/ 
const int Max=1000;
typedef int ElemType;

ElemType Heap[Max];

int Sift_Up(int i)      //上移

{

    ElemType temp;

    bool flag;

    flag = true;

    if(i == 1)     return 0;

    do {

        if(Heap[i] > Heap[i/2])

        {temp=Heap[i];     Heap[i]=Heap[i/2];     Heap[i/2]=temp;}

        else     flag = false;

          i /= 2;

    }while(i>1 || flag);

    return 1;

}

int Sift_Down(int i,int n)   //下移

{

    bool flag;

    ElemType temp;

    flag = false;

    if(2*i > n)     return 0;

    do {

        i*=2;

        if(i+1 <= n && Heap[i+1] > Heap[i])     i++;

        if(Heap[i/2] < Heap[i])

        {temp=Heap[i];     Heap[i]=Heap[i/2];     Heap[i/2]=temp;}

        else     flag = false;

    }while(2*i<=n || flag);

    return 1;

}

int Insert(int &n,ElemType x)    //插入元素

{

    Heap[++n] = x;

    if( Sift_Up(n) )     return n;

}

int Delete(int &n,int i)   //输出元素

{

    ElemType x,y;

    x = Heap[i];     y = Heap
;

    n--;

    if(i == n+1)     return x;

    Heap[i] = y;

    if(y >= x)     Sift_Up(i);

    else          Sift_Down(i,n);     

    return x;

}

int Delete_Max(int &n)     //输出最大值

{

    ElemType x;

    x = Heap[1];

    Delete(n,1);

    return x;

}

int Make_Heap(int n)    //转换为大顶堆

{

    int i;

    for(i=n/2; i >= 1 ;i--)     Sift_Down(i,n);

    return n;

}

int HeapSort(int n)  //非降序排序

{

    int i;

    ElemType temp;

    Make_Heap(n);

    for(i=n; i >= 2 ;i--) {

        temp=Heap[i];     Heap[i]=Heap[1];     Heap[1]=temp;

        Sift_Down(1,i-1);

    }

    return 1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉堆