1、算法原理
原理部分参考下面这个博客即可:
堆排序算法(图解详细流程)

2、C++实现:

解法一:利用vector实现最大堆
注意:heap_max这个函数调用了两次: 建堆时候和交换最大值之后分别调用一次:

//注意:是把一个数组想象成了最大堆!!!!!!
//利用最大堆这种数据结构进行排序:先构建个最大堆,
//然后将根节点与数组最后一个元素交换,然后对剩下的N-1个元素进行迭代(建堆、交换)
void heap_sort(vector<int> &input)
{//build_heap(input);// 1、先建堆!!!!!!!//从第一个非叶子节点开始调整的原因在于叶子节点没有孩子,那么显然它也就满足堆的性质,也就没有调整的必要了。for(int i=input.size()/2-1;i>=0;i--)//根节点为0,最后一个叶节点的下标为n-1,//其父节点是第一个非叶节点,下标为((n-1)-1 )/ 2 = (n-2)/2 = n/2 - 1{heap_max(input,i,input.size()); //建堆时候这个参数n(第三个参数)一直不变,但是i在变}///2、把最大元素移除  接着进行见堆!!!!for(int j=input.size()-1;j>0;j--) //这里的j是大于0   没有等于{// 将根节点(最大值)与数组待排序部分的最后一个元素交换,这样最终得到的是递增序列int temp;temp = input[0];input[0] = input[j];input[j] = temp;// 待排序数组长度减一,只要对换到根节点的元素进行排序,将它下沉就好了。heap_max(input,0,j);  //这个时候i这个参数不变,但是参数n(j)一直在变}
}
// void build_heap(vector<int> &input) //构建最大堆
// {
//     //从第一个非叶子节点开始调整的原因在于叶子节点没有孩子,那么显然它也就满足堆的性质,也就没有调整的必要了。
//     for(int i=input.size()/2-1;i>=0;i--)//根节点为0,最后一个叶节点的下标为n-1,
//                                        //其父节点是第一个非叶节点,下标为((n-1)-1 )/ 2 = (n-2)/2 = n/2 - 1
//     {
//         heap_max(input,i,input.size());
//     }
// }
void heap_max(vector<int> &input, int i,int n)//将i节点为根的堆中大的数依次上移,n表示堆中的数据个数
{int left = 2*i+1;  // i节点的左孩子int right = 2*i+2;   // i节点的右孩子int largest = i; //先设置父节点和子节点三个节点中最大值的位置为父节点下标if(left<n&&input[left]>input[largest]){largest = left;}if(right<n&&input[right]>input[largest]){largest = right;}if(largest!=i)  //最大值不是父节点,则进行交换{int temp;temp = input[i];input[i] = input[largest];input[largest] = temp;heap_max(input,largest,n); //递归调用,保证子树也是最大堆}}

解法二:利用STL的优先级队列

//堆排序解法二:利用STL的优先级队列
void heap_sort2(vector<int> &input)
{//priority_queue< int, vector<int>, greater<int> > a;  // 小顶堆//priority_queue< int, vector<int>, less<int> > q;     // 大顶堆priority_queue<int> a;  //默认是大顶堆for(int i=0;i<input.size();i++){a.push(input[i]);//优先级队列在push的时候就已经自动排序了,最大值在第一个,后面的没有排序}for(int j=0;j<input.size();j++){input[input.size()-1-j] = a.top(); //把最大值给到最后一个//input[j] = a.top();//小顶堆是直接对应赋值a.pop();}}

解法三:利用#include <algorithm 里的把迭代器指定的range当堆 以及make_heap、push_heap、pop_heap、sort_heap

void heap_sort3(vector<int> &input)
{//make_heap(input.begin(),input.end(), less<int>());//创建大顶推 此时向量第一个元素为最大值//make_heap(input.begin(),input.end(), greater<int>());//创建小顶推 此时向量第一个元素为最小值for(int i=0;i<input.size()-1;i++){make_heap(input.begin()+i,input.end(), greater<int>());}}

参考文献:

1、C++中两种实现堆的方式:make_heap和priority_queue

2、c++优先队列(priority_queue)用法详解

3、剑指offer39题解法

堆排序算法原理及C++实现(详细注释)相关推荐

  1. 【综合评价分析】熵权算法确定权重 原理+完整MATLAB代码+详细注释+操作实列

    [综合评价分析]熵权算法确定权重 原理+完整MATLAB代码+详细注释+操作实列 文章目录 1. 熵权法确定指标权重 (1)构造评价矩阵 Ymn (2)评价矩阵标准化处理 (3)计算指标信息熵值 Mj ...

  2. 【综合评价分析】topsis评价 原理+完整MATLAB代码+详细注释+操作实列

    [综合评价分析]topsis评价 原理+完整MATLAB代码+详细注释+操作实列 文章目录 1.TOPSIS法的原理 2.TOPSIS法案例分析 3.建立模型并求解 3.1数据预处理 3.2代码实现数 ...

  3. 堆排序算法原理及c++实现

    文章目录 准备知识 MAX-HEAPIFY过程 建堆 堆排序算法 总结 准备知识 堆的结构可以分为最大堆和最小堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序. 所谓完全二叉树即叶节 ...

  4. 堆排序 java_详解堆排序算法原理及Java版的代码实现

    概述堆排序是一种树形选择排序,是对直接选择排序的有效改进. 堆的定义如下:具有n个元素的序列(k1,k2,...,kn), 当且仅当满足: 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素)必为 ...

  5. 蓝桥杯算法训练 无聊的逗-详细注释版

    试题 算法训练 无聊的逗 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木 ...

  6. 二叉树的非递归遍历算法C语言实现(详细注释版)

    二叉树的非递归算法遍历分为:先序遍历,中序遍历,后序遍历. 此文章我会根据先.中.后的顺序为大家用C语言实现全部代码. 顾名思义先序遍历是先遍历根节点,随后是左孩子,右孩子 . 中序遍历与后序遍历可以 ...

  7. 算法和数据结构c语言源代码,【资料分享】 数据结构与算法全集(C源代码+详细注释)!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 │ │ BiTree.cpp │ │ BiTree.h │ │ LinkQueue.cpp │ │ LinkQueue.h │ │ main.cpp │ ...

  8. 数据结构与算法 c语言 百度网盘,【资料分享】 数据结构与算法全集(C源代码+详细注释)!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 │ │ BiTree.cpp │ │ BiTree.h │ │ LinkQueue.cpp │ │ LinkQueue.h │ │ main.cpp │ ...

  9. 非常全面的谱聚类算法原理总结

    谱聚类算法是目前最流行的聚类算法之一,其性能及适用场景优于传统的聚类算法如k-均值算法,本文对谱聚类算法进行了详细总结,内容主要参考论文<A Tutorial on Spectral Clust ...

最新文章

  1. python文件读取输出-Python 读写文件中数据
  2. display: none;、visibility: hidden、opacity=0区别总结
  3. 数据库:数据库的连接池原理及实现
  4. Freebsd10.3(FreeBSD11 Beta1)使用手记
  5. Raw 暗场校准 II
  6. centos7安装svn服务
  7. Project Tango 的一些应用
  8. 原来MySQl就是这样工作的
  9. LeetCode 1758. 生成交替二进制字符串的最少操作数(DP)
  10. ajax预加载html seo,前端性能优化 — JS预加载和懒加载
  11. 读取properties文件,中文乱码
  12. SpringBoot RESTful 应用中的异常处理小结
  13. 计算机毕业生学士服,特殊毕业季,这些“别人家的高校”为毕业生送上定制版学士服...
  14. solidworks中皮带同步轮配合如何做?几张图教会你
  15. app安全渗透测试详细方法流程
  16. 经典对抗攻击Deepfool原理详解与代码解读
  17. java计算机毕业设计校园讲座管理源码+系统+lw文档+mysql数据库+部署
  18. JS中的CommonJS和AMD
  19. 单号查询方法,怎么查快递物流到哪里了
  20. linux下的hiredis的安装和使用(一)

热门文章

  1. 「硬见小百科」几款常用的保护电路
  2. Java堆排序(大顶堆小顶堆及应用实例)
  3. MCS-51单片机常用汇编指令大全
  4. Python excel xlwings+QT 考勤表开发 -【Python Office开发基础培训】 拆分合并文件
  5. 优启通 v3.7.2022.0106 官方22年1月VIP版
  6. 理论:详解Linus的目录和文件管理
  7. 哈工大车万翔:ChatGPT时代,NLPer 的危与机
  8. gstreamer学习笔记---pad定义、连接、流动
  9. Postfix构建Exchange Server 2010邮件网关部署系列五:升级Exchange 2010 SP3补丁
  10. 防止孩子使用计算机的软件,巧用win7锁定计算机 防止孩子沉迷游戏