----堆----希望这是一个容易上手的工具--------

本文介绍了堆的概念,包括最大堆和最小堆,并详细讲解了如何使用数组表示完全二叉树来实现堆,以及堆的基本操作如创建、插入和删除最大元素等。

什么是堆?

  优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是依照元素的优先级(关键字)大小,而不是元素进入队列的先后顺序。

下面再次开始储存选择  ::>_<::

 堆堆堆,完全二叉树。。用数组表示。。o(∩_∩)o 哈哈。。。我仿佛又燃烧了起来!

→堆得两个特性

  结构性:用数组表示的完全二叉树:

  有序性:任一节点的关键字使其子树所有节点的最大值(最小值)

        ♢“最大堆(MaxHeap)”也称“大顶堆”;最大值 

        ♢“最小堆(MinHeap)”也称“小顶堆”;最小值

 

1:完全二叉树。2:有序性。

数据对象集:完全二叉树,每个节点的元素值不小于其子节点的元素值
操作集:    最大堆H∈MaxHeap   元素item∈ElementType,主要操作有;
------MaxHeap Create(int MaxSize):创建一个空的最大堆
------Boolean IsFull(MaxHeap H):判断最大堆H是否已满
------Insert (MaxHeap H,ElementType item):将元素item插入最大堆H。
------Boolean IsEmpty(MaxHeap H):判断最大堆H是否为
MaxHeap Create(int MaxSize)
{//创建容量为MaxSize的空的最大堆。
    MaxHeap H=malloc(sizeof(struct HeapStruct));
    H->Elements=malloc((MaxSize+1)*sizeof(ElementType));
    H->Size=0;  //堆的当前元素个数   为0  //现在才开始创建堆
    H->CapaCity=MaxSize; //用于记忆堆的最大容量是多少(MaxSize)。
    H->Elements[0]=MaxDate;//哨兵   为最大堆中所有元素的可能的值,便于以后更快的操作。
    return H;
}
void Insert (MaxHeap H,ElementType item)//在堆
ElementType DeleteMax(MaxHeap H) 
{        //从最大堆H中取出关键值为最大的元素,并且删除一个节点.
    int Parent,Child;
    ElementType MaxItem,Temp;
    if(IsEmpty(H))
    {
        printf("最大堆为空\n");
        return ;
    }
    MaxItem=H->Element[1];//   把最大的元素先储存起来,用于返回.
    temp=H->Elements[H->Size--];//本来元素个数就需要减一,所以这样一起搞定,让temp=最后的元素,
    for(Paren=1;Parent*2<=H->Size;Parent=Child)
    {   
        Child=2*Parent;
    if((Child!=H->Size)&&(H->Elements[Child])<H->Elements[Child+1])
        Child++;
    if(temp>=H->Elements[Child])
        break;
    else
        H->Elements[Parent]=H->Elements[Child];
    }
    H->Elements[Parent]=temp;
    return MaxItem;
}

 

H中插入 item
{ //将元素iten插入最大堆H,其中H->Elements[0]已经定义为哨兵
    int i;
    if(IsFull(H))
    {
        printf("最大堆已满\n");
        return ;
    }
    i=++H->Size;//将堆中的元素扩大了一。
    for(;H->Elements[i/2]<item;i/=2)       //将需要插入元素和气所在位置的祖上比较
        H->Elements[i]=H->Elements[i/2];
    H->Elements[i]=item;
}

 

ElementType DeleteMax(MaxHeap H) 
{        //从最大堆H中取出关键值为最大的元素,并且删除一个节点.
    int Parent,Child;
    ElementType MaxItem,Temp;
    if(IsEmpty(H))
    {
        printf("最大堆为空\n");
        return ;
    }
    MaxItem=H->Element[1];//   把最大的元素先储存起来,用于返回.
    temp=H->Elements[H->Size--];//本来元素个数就需要减一,所以这样一起搞定,让temp=最后的元素,
    for(Paren=1;Parent*2<=H->Size;Parent=Child)
    {   
        Child=2*Parent;
    if((Child!=H->Size)&&(H->Elements[Child])<H->Elements[Child+1])
        Child++;
    if(temp>=H->Elements[Child])
        break;
    else
        H->Elements[Parent]=H->Elements[Child];
    }
    H->Elements[Parent]=temp;
    return MaxItem;
}

 

/*最大堆的建立*/
将已存在的N个元素按照最大堆的要求放在一个一维数组中
方法1:通过插入操作,将N个元素一个一个相继的插入到一个初始为空的堆中去.时间最大代价为NlogN

转载于:https://www.cnblogs.com/A-FM/p/5146405.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值