zoukankan      html  css  js  c++  java
  • ----堆----希望这是一个容易上手的工具--------

    什么是堆?

      优先队列(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("最大堆为空
    ");
            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("最大堆已满
    ");
            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("最大堆为空
    ");
            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

  • 相关阅读:
    pycharm 使用pip3更新插件已经更新时报错
    剑指Offer系列之题11~题15
    剑指Offer系列之题1~题5
    个人hexo博客(静态,无后台)搭建
    设计模式之单例模式
    Hibernate实现limit语句效果
    Springboot项目中 前端展示本地图片
    eclipse报错:problems during content assist
    python中open与with open的区别
    修改Jenkins目录
  • 原文地址:https://www.cnblogs.com/A-FM/p/5146405.html
Copyright © 2011-2022 走看看