《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)

《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

阅览、认为、编写代码!

/*********************************************
 * copyright@hustyangju
 * blog: http://blog.csdn.net/hustyangju
 * 题目:堆排序实现,另外实现接口:取堆最大值并删除、堆插入
 * 思路:堆是在顺序数组原址上实现的。利用全然二叉树的性质。更具最大堆和最小堆的定义实现的。
 * 经典应用场景:内存中堆数据管理
 * 空间复杂度:堆排序是在原址上实现的,为0
 * 时间复杂度:堆排序为O(n lgn) ,取最值O(1)。插入最坏为O(lgn)
*********************************************/
#include <iostream>
#include <algorithm>

using namespace::std;

//对堆排序实现类的定义
class HeapSort
{
 public:
     HeapSort(int *pArray , int nArraySize);//constructor
     ~HeapSort();//destructor
 private:
    int *m_pA;//points to an array
    int m_nHeapSize;//stands for the size
 public:
    void BuildMaxHeap(); //build a heap
    void Sort();//建一个最大堆并排序。依照顺序(由小到大)放在原数组
    int  PopMaxHeap();//取最大堆的最大值
    void InsertMaxHeap(int a);//插入一个新值到最大堆,事实上就是在元素尾部增加一个值,再维护最大堆的性质
    void print();//顺序输出数组
 protected:
    int LeftChild(int node);//取左孩子下标
    int RightChild(int node);//取右孩子下标
    int Parent(int node);//取父节点下标
    void MaxHeapify(int nIndex);//justify the heap
 };

//构造函数初始化
HeapSort::HeapSort( int *pArray, int nArraySize )
{
     m_pA = pArray;
     m_nHeapSize = nArraySize;
}

//析构函数
HeapSort::~HeapSort()
{
}

//取左孩子下标。注意沿袭数组从0開始的习惯
int HeapSort::LeftChild(int node)
{
   return 2*node + 1;// the array starts from 0
}

//取右孩子下标
int HeapSort::RightChild(int node)
{
     return 2*node + 2;
}

//取父节点下标
int HeapSort::Parent(int node)
{
   return (node-1)/2 ;
}

//利用递归维护最大堆的性质。前提是已经建好最大堆。仅仅对变动的结点调用该函数
void HeapSort::MaxHeapify(int nIndex)
{
     int nLeft = LeftChild(nIndex);
     int nRight = RightChild(nIndex);

     int nLargest = nIndex;

     if( (nLeft < m_nHeapSize) && (m_pA[nLeft] > m_pA[nIndex]) )
         nLargest = nLeft;

     if( (nRight < m_nHeapSize) && (m_pA[nRight] > m_pA[nLargest]) )
        nLargest = nRight;

     if ( nLargest != nIndex )//假设有结点变动才继续递归
    {
         swap<int>(m_pA[nIndex], m_pA[nLargest]);
         MaxHeapify(nLargest);
     }
 }

//建造最大堆,思路:对于一个全然二叉树,子数组A[int((n-1)/2)+1]~A[n-1]为叶子结点
//A[0]~A[int((n-1)/2)]为非叶子结点。从下到上,从最后一个非叶子结点開始维护最大堆的性质
 void HeapSort::BuildMaxHeap()
 {
     if( m_pA == NULL )
         return;

     for( int i = (m_nHeapSize - 1)/2; i >= 0; i-- )
    {
         MaxHeapify(i);
     }
}

 //不断取最大堆的最大值A[0]与最后一个元素交换,将最大值放在数组后面。顺序排列数组
 void HeapSort::Sort()
{
     if( m_pA == NULL )
         return;
     if( m_nHeapSize == 0 )
        return;
    for( int i = m_nHeapSize - 1; i > 0; i-- )
     {
        swap<int>(m_pA[i], m_pA[0]);
         m_nHeapSize -= 1;//这个表达式具有破坏性!!

! MaxHeapify(0); }} //取出最大值,并在堆中删除 int HeapSort::PopMaxHeap() { /*if( m_pA == NULL ) return ; if( m_nHeapSize == 0 ) return ;*/ int a= m_pA[0]; m_pA[0]=m_pA[m_nHeapSize-1]; m_nHeapSize -= 1; MaxHeapify(0); return a; } //插入一个值。思路:放在数组最后面(符合数组插入常识),再逐层回溯维护最大堆的性质 void HeapSort::InsertMaxHeap(int a) { /* if( m_pA == NULL ) return; if( m_nHeapSize == 0 ) return; */ m_nHeapSize += 1; m_pA[m_nHeapSize-1]=a; int index=m_nHeapSize-1; while(index>0) { if(m_pA[index]>m_pA[Parent(index)]) { swap(m_pA[index], m_pA[Parent(index)]); index=Parent(index); } else index=0;//注意这里。某一层已经满足最大堆的性质了,就不须要再回溯了 } } //顺序输出数组 void HeapSort::print() { for(int i=0;i<m_nHeapSize;i++) cout<<m_pA[i]<<" "; cout<<endl; } int main() { int a[10]={6,5,9,8,1,0,3,2,7,4}; //int max; cout<<"input an array::"<<endl; for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; HeapSort myHeap(a,10); myHeap.BuildMaxHeap(); cout<<"pop the max number:"<<endl; cout<<"the max="<<myHeap.PopMaxHeap()<<endl; cout<<"after pop:"<<endl; myHeap.print(); myHeap.InsertMaxHeap(11); cout<<"insert a number and sort:"<<endl; myHeap.Sort(); // myHeap.print(); for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; }

測试结果:

《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)

版权声明:本文博主原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117131.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • selenium3.0不用代理的情况下,获取异步请求的数据

    selenium3.0不用代理的情况下,获取异步请求的数据最近爬取一个网站的时候,反爬比较厉害,各种弹窗,各种验证码,无限debugger,关键数据是ajax请求异步加载的。使用代理绕过前面几种反爬后,获取ajax的request和response成了头疼的问题,最终使用selenium的network日志分析来解决。为了方便以后使用,写了一个工具类:importjsonfromseleniumimportwebdriverfromselenium.webdriverimportDesiredCapabilitiesdefget

    2022年7月26日
    7
  • golan激活码【在线破解激活】

    golan激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    46
  • IDEA2018.1.4 破解教程

    第一步:下载破解补丁==》http://idea.lanyus.com/下载之后得到==》JetbrainsCrack-2.10-release-enc.jar第二步:重命名去掉-release-enc,然后放在IDEA安装目录的bin文件夹里面第三步:分别在idea.exe.vmoptions和idea64.exe.vmoptions文件里的最后一行添加-java…

    2022年4月6日
    141
  • 锁屏时钟APP_linux时钟同步服务器设置

    锁屏时钟APP_linux时钟同步服务器设置桌面锁屏时钟里的桌面美化功能非常多,并且也都很实用,不仅可以帮助用户把手机桌面设置的更加简洁,查找东西变得更方便,而且用户还能够使用自定义设置的方式来将自己手机桌面的内容,进行不同的展示,桌面锁屏时钟app就算在锁屏的状态下也能够显示当前的时间,非常便捷。桌面锁屏时钟优势1.一款极简实用时钟,适合每一个喜欢简约的你。2.主界面是自带时间、日期、天气温度的LED电子数字时钟。3.经典的动态翻页效果,…

    2022年9月29日
    1
  • 常用降压电路设计「建议收藏」

    常用降压电路设计「建议收藏」一、5V转3.3V电路设计1.AMS1117-3V3AMS1117-xxx是一颗LDO芯片,这个系列有很多型号,后面的xxx代表输出电压,如果是AMS1117-ADJ表明输出是通过电阻调节的。实物图展示:常见封装:电路图:AMS1117-3.3最大输出可达1A,但是其压差较大,一般在1.1V左右,所以功耗和发热量也会随着电流的增大而急剧增大,对于大电流负载,不推荐使用LDO电路,使用DCDC电路效果更佳。2.ME6211C33ME6211C33是一颗低功耗低压差LDO芯片,其工作

    2022年6月20日
    32
  • 中标麒麟配置本地yum源_优麒麟系统安装

    中标麒麟配置本地yum源_优麒麟系统安装在linux系统上,解决软件包之间的依赖关系是很重要的事。很多工作无法实现可能就是因为缺少一个软件包,而当你千方百计找到这个软件包的时候,却发现它跟当前系统不兼容。所以,要做的非常重要的一件事情就是给系统添加软件仓库,以确保能安装使用大部分软件包。(亲测)建议看完文章再动手配置实验环境:[1-06@localhostDesktop]$uname-aLinuxlocalh…

    2022年8月10日
    158

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号