当前位置: 首页 > news >正文

堆排序 SCAU c++

堆排序大体思路是:建堆,然后通过堆交换结点大小,将最大的结点放到堆最顶端,将该最大数与数组最后一位交换,不断重复这个过程,直到数组从后往前逐渐完成排序。

此题用大根堆排序和小根堆排序都行,只有一点细微上的差别。

比如每次swap交换的是数组第一位而不是最后一位,然后在adjust函数中判别条件是左右孩子结点取小的那个,父节点小于该孩子结点,那就更换,换到最后堆顶为最小的。

大根堆代码详解如下,附在代码注释中:

#include <iostream>
#include <stdio.h>

using namespace std;

void HeadAdjust(int a[],int k,int len)//每次调整都从数组第一位开始慢慢向后调整
{
    a[0]=a[k];//k为对应父节点下标

    for(int i=2*k;i<=len;i*=2)
    {
        //对于父节点和两个子节点,要更换的是子节点中更大的那一个跟父节点换
        if(i<len && a[i]<a[i+1])//如果左孩子小于右孩子
            i++;

        if(a[0]>=a[i])//如果父节点比更大的那个孩子数值还要大,就不用交换
            break;
        else
        {
            a[k]=a[i];//父节点与孩子交换
            k=i;//将k也就是下标往下移动,换到更大的结点那里,继续往下找看看还有没有需要换的结点
        }

    }

    a[k]=a[0];//此时父节点数值可以放入该位置了,因此左右孩子都比他小了

}

void BuildMaxHeap(int a[],int len)
{
        for(int i=len/2;i>0;i--)//从底向上建
        {
            HeadAdjust(a,i,len);
        }

}

void HeapSort(int a[],int len)
{
    //BuildMaxHeap(a,len);

    for(int i=len;i>1;i--)
    {
        swap(a[i],a[1]);//将大根堆的最顶端也就是数组中最大的数已处于数组第一位,与数组最后一位交换,然后就是倒数第二,倒数第三
        HeadAdjust(a,1,i-1);//然后再对堆进行交换,最后一位已经是最大的了所以不用排序了

        for(int j=1;j<=len;j++)
        {
            printf("%d ",a[j]);
        }
        printf("\n");

    }

}


int main()
{
    int n,i;
            //思路是,建堆,然后通过堆交换结点大小,将最大的结点放到堆最顶端,将该最大数与数组最后一位交换,不断重复这个过程
    scanf("%d",&n);
    int a[n+1];

    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }

    BuildMaxHeap(a,n);//先建堆,大根堆,建成完全二叉树先

    for(int j=1;j<=n;j++)
    {
        printf("%d ",a[j]);
    }
    printf("\n");

    HeapSort(a,n);//然后调堆


    return 0;
}

 

 欢迎大家在评论区留言~~

觉得有帮助的不妨点个赞

 

相关文章:

  • 归并排序(非递归)超详细解答!!
  • PAT乙级 一元多项式求导(1010)详细解答c++
  • C语言课程设计物品竞拍管理(成品版!)
  • 折半查找判定树的画法(较简单易懂!)
  • 剑指 Offer 58 - I. 翻转单词顺序c++解法
  • 2. 两数相加 -力扣c++解法
  • 7.整数反转 - 力扣(LeetCode)
  • 1523. 在区间范围内统计奇数数目 -力扣
  • 9. 回文数 -力扣(leetCode)c++解法
  • 想要学会c++的STL?这一篇文章就足够啦!
  • 455. 分发饼干 -力扣(leetCode)c++贪心算法
  • 135. 分发糖果 -力扣(leetCode)c++贪心算法
  • 435. 无重叠区间 -力扣(leetCode)c++贪心算法
  • 605. 种花问题 -力扣(leetCode)c++贪心算法
  • 关于DOM的w3c文档学习笔记总结
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • eclipse的离线汉化
  • flutter的key在widget list的作用以及必要性
  • iOS编译提示和导航提示
  • JavaScript 奇技淫巧
  • java取消线程实例
  • java中的hashCode
  • Linux CTF 逆向入门
  • Spark RDD学习: aggregate函数
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 入门到放弃node系列之Hello Word篇
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 用Python写一份独特的元宵节祝福
  • zabbix3.2监控linux磁盘IO
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​业务双活的数据切换思路设计(下)
  • #1014 : Trie树
  • #HarmonyOS:Web组件的使用
  • #宝哥教你#查看jquery绑定的事件函数
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C)一些题4
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)springcloud实战之config配置中心
  • (二)WCF的Binding模型
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm码农论坛 毕业设计 231126
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)linux文件内容查看
  • (一)为什么要选择C++
  • (转)Oracle存储过程编写经验和优化措施
  • (转)Sql Server 保留几位小数的两种做法
  • (转)Sublime Text3配置Lua运行环境