1、堆排序

堆排序采用堆的这种数据结构,堆首先是一颗完全二叉树。

堆又分为大顶堆和小顶堆

大顶堆就是父节点数值大于等于左右节点数值

小顶堆是父节点数值小于等于左右节点数值

下标为i的节点的父节点下表为:(i-1)/2

下标为i的节点的左孩子下表为:i*2+1

下标为i的节点的右孩子下表为:i*2-1

将一个无序数组变成有序的,首先就是得建堆,就是heap_sort的第一步

第一个函数的heapify只是为了维护堆的性质

#include<iostream>using namespace std;
void sw(int &a,int &b) {int temp = a;a = b;b = temp;
}
// arr[]为完全二叉树层序遍历得到的数组
// n为完全二叉树的节点,即数组长度
// i为待维护的节点
void heapify(int arr[], int n, int i) {    //把这个二叉树先堆化//递归出口if (i >= n) return;int largest = i;int lson = i * 2 + 1;int rson = i * 2 + 2;if (lson < n && arr[largest] < arr[lson]) {  //和左孩子数值比较,找到最大节点,赋值下标largest = lson;}if (rson < n && arr[largest] < arr[rson]) {  //和右孩子数值比较,找到最大节点,赋值下标largest = rson;}if (largest != i) {   //如果现在的最大值下标和之前的不一样,那么交换二者的数值//sw(arr[largest], arr[i]);swap(arr[largest], arr[i]);heapify(arr, n, largest); //进行一个递归,因为在上一层的节点交换完之后,无法保证下边父节点大于孩子节点}}
void heap_sort(int arr[], int n) {//建堆int lastNode = n - 1;    //从后往前建堆int parent = (lastNode - 1) / 2;for (int i = parent; i >= 0; i--) {heapify(arr, n, i);}//堆排序for (int i = n - 1; i >= 0; i--) {sw(arr[i], arr[0]);heapify(arr, i, 0);}
}
int main() {int arr[5] = { 5,4,3,2,1 };heap_sort(arr, sizeof(arr) / sizeof(arr[0]));for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {cout << arr[i] << endl;}return 0;
}

堆排序(heapsort)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Eb41147dK?spm_id_from=333.337.search-card.all.click

参考了这个视频

************************************2022.5.27********************************************

#include<iostream>
#include<algorithm>
using namespace std;// arr[]   待排序数组
// n       数组长度
// i       待维护节点下标
void heapify(int arr[], int n, int i) {int largest = i;         //设此节点为最大节点int lson = i * 2 + 1;    //找到它的左孩子下标int rson = i * 2 + 2;   //找到右孩子下标if (lson < n && arr[lson] > arr[largest]) {  //和左孩子比较,找到最大值下标largest = lson;}if (rson < n && arr[rson]>arr[largest]) {  //和右孩子比较,找到最大值下标largest = rson;}if (largest != i) {swap(arr[largest], arr[i]);heapify(arr, n, largest);}
}void heap_sort(int arr[], int n) {//建堆int lastNode = n - 1; //数组长度为nint parent = (lastNode - 1) / 2;for (int i = parent; i >= 0; i--) {heapify(arr, n, i);}  //到这里已经成为了一个大顶堆//排序for (int i = n - 1; i >= 0; i--) {swap(arr[i], arr[0]);  //最后一个元素和第一个元素(大顶堆)做交换heapify(arr, i, 0);  //交换完之后还要维护大顶堆性质}}int main() {int arr[10] = { 9,5,1,3,4,7,6,2,8,10 };heap_sort(arr, sizeof(arr) / sizeof(arr[0]));for (auto x : arr) {cout << x << " ";}return 0;
}

c++十大排序——堆排序相关推荐

  1. 算法 十大排序 堆排序

    十种排序算法--堆排序(小顶堆) 首先要了解什么是堆?小顶堆又是什么?而堆排序是十种排序种唯一种自定义的数据结构 这里的堆就是我们所熟悉的二叉树 而小顶堆又是什么呢? 小顶堆就是根节点比子节点小,子节 ...

  2. 十大排序算法之堆排序

    十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...

  3. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  4. 这或许是东半球分析十大排序算法最好的一篇文章

    作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强 ...

  5. 「干货总结」程序员必知必会的十大排序算法

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...

  6. 「归纳|总结」程序员必知必会的十大排序算法

    微信搜一搜「bigsai」关注这个有趣的程序员 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star 本文目录 绪 ...

  7. 归并排序执行次数_十大排序算法,看这篇就够了

    排序算法分类[1][2] 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以 ...

  8. 八十八、Python | 十大排序算法系列(下篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  9. C 数据结构之十大排序

    C 数据结构之十大排序 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳 ...

最新文章

  1. 【杂谈】认识有三AI的一年,从机械转行CV到专栏作者
  2. S3c2410_SDIO_调试笔记二
  3. 日本惊现神操作!偷偷研究飞刀方程致使厕所爆炸......
  4. 6-7 使用函数输出水仙花数_「Java」再议printf函数
  5. 【leveldb】整体架构
  6. Perceptual Losses for Real-Time Style Transfer and Super-Resolution
  7. VMWARE下安装Linux系统 CentOS-7-x86
  8. IDEA 这个小技巧太实用了。。
  9. Harris角点检测原理分析
  10. php 开源邮件系统,20款 Web Mail PHP开源项目
  11. 远控免杀专题10--TheFatRat免杀
  12. springsoure.sts下载地址
  13. excel 合并单元格筛选
  14. selenium之使用driver及其属性
  15. Linus Torvalds:最庆幸的是 30 年后,Linux 不是一个“死”项目
  16. Unsupervised Domain Adaptive Re-Identification: Theory and Practice阅读总结
  17. WPS计算机一级考试知识点,计算机一级考试WPS练习题及答案
  18. 为何,以及如何提炼一个函数
  19. A段架构设计_隽语集(IT+設計思考_1801)
  20. 研究生周报(第十九周)

热门文章

  1. [Java学习] DFS算法示例
  2. 专家称今年气候极端异常 需谨防秋汛及冬季低温
  3. python编写会计凭证金蝶_金蝶采购发票如何生成凭证
  4. conda环境的复制与安装
  5. (搬出自小码哥base64)经验贴-基于Vc++开发IIS7以及IIS6的万能筛选器
  6. 这些常见的C语言字符串操作面试题,被问到了吗?
  7. 电脑维修中的“八先八后”是什么?
  8. JavaScript基础精讲
  9. 单级倒立摆从建模到仿真
  10. 计算机管理任务计划程序损坏,处理设置任务计划程序win10中出错不可用的方法...