最小堆的一些操作

包括:建立、插入一个节点、删除其中一个节点,用最小堆排序。

#include <iostream>
using namespace std;
int const len=10;
//建立一个最小堆

int left(int i)
{
    return 2*i+1;
}
int right(int i)
{
    return 2*i+1+1;
}
int parent(int i)
{
    return (i+1)/2-1;
}
void minheapify(int *A,int i,int heapsize)
{
    int l=left(i),r=right(i);
    int smallest=i,temp=0;
    if (l<heapsize&&A[l]<A[i])
        smallest=l;
    else
        smallest=i;
    if(r<heapsize&&A[r]<A[smallest])
        smallest=r;
    if(smallest!=i)
    {
        temp=A[i];
        A[i]=A[smallest];
        A[smallest]=temp;
        minheapify(A,smallest,heapsize);
    }
}

void buildheap(int *A,int heapsize)
{
    for(int i=len/2-1;i>=0;i--)
    {
        minheapify(A,i,heapsize);
    }
}

void heapinsert(int *A,int &heapsize,int key)
{
    heapsize++;
    int i=heapsize-1;
    A[i]=key;
    int p=parent(i),temp;
    while(p>=0&&A[p]>A[i])
    {
        temp=A[p];
        A[p]=A[i];
        A[i]=temp;
        i=p;
        p=parent(i);
    }
}
void heapdelete(int *A,int i,int &heapsize)
{
    A[i]=A[heapsize-1];
    heapsize--;
    minheapify(A,i,heapsize);
}
int main()
{
    int A[len];
    int heapsize=0,temp;
    for (int i=0;i<len;i++)
        cin>>A[i];
   //建堆
    heapsize=len-2;//,可以自己设置堆的大小,此处堆的大小不等于数组的大小。
    buildheap(A,heapsize);
    for (int i=0;i<heapsize;i++)
        cout<<A[i]<<' ';
        cout<<endl;

 //插入新的结点,在堆的后面加上一个新元素,然后将其浮上去。
    heapinsert(A,heapsize,1);
    for (int i=0;i<heapsize;i++)
        cout<<A[i]<<' ';
        cout<<endl;
//从中删除结点。在删除的结点处,运行minheapify,因为该结点的左右子树均为最小堆,满足运行minheapify的条件。
    heapdelete(A,2,heapsize);
    for (int i=0;i<heapsize;i++)
        cout<<A[i]<<' ';
        cout<<endl;

//最小堆排序,逆序的
    for(int i=heapsize-1;i>=1;i--)
    {
        temp=A[i];
        A[i]=A[0];
        A[0]=temp;
        heapsize--;
        minheapify(A,0,heapsize);
    }
    for (int i=0;i<len;i++)//输出数组所有的元素。
        cout<<A[i]<<' ';
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值