堆排序

在上一章节里我们完成了堆的实现和基本操作:https://blog.csdn.net/qq_35423154/article/details/104598702
这里就顺带讲一讲堆排序

堆排序是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种。通过堆来进行数据选择

时间复杂度: O (N*logN)
空间复杂度: O (1)
稳定性:不稳定

下面来讲一下具体思路
如利用下面这段数据

int arr[] = {46, 74, 53, 14, 26, 36, 86, 65, 27, 34};

首先将它写成堆的形式

然后利用向下调整算法把他调整为一个大根堆

void AdjustDown(int *arr, int size, int root)
{int parent = root;int child = parent * 2 + 1;while(child < size){if(child + 1 < size && arr[child] < arr[child + 1]){++child;}if(arr[child] > arr[parent]){int temp = arr[parent];arr[parent] = arr[child];arr[child] = temp;}elsebreak;parent = child;     child = parent * 2 + 1;}
}


这个算法在上一章就讲过了,在这里就不说了。

在这里有一个需要注意的地方,如果要排升序,就要建立大根堆,如果排降序,就要建立小根堆。

按照正常的思路, 排升序应该把小的放在前面,应该建立小根堆,这样的算法不是不行,但是效率太低,因为当我们排完一趟之后,堆的结构就会被完全打乱,我们就需要再次建立一个小根堆,这样的效率是极其低下的。但是我们如果用大根堆,堆顶是最大的数据,我们把他和末尾数字交换,我们就把最大的数据放到最后了,按照这种方法一次将次大数据放到末尾,就完成了排序

这就是堆排序的核心,也就是选择排序的思路,每趟选择一个最大或者最小的元素放到它应该呆的位置上。

同时,使用大根堆还有一个优势,就是交换后堆的结构没有被破坏,只需要一趟向下排序算法就可以再次建立大根堆,这样的效率是非常高的。

void HeapSort(int *arr, int size)
{int i = 0;for(i = (size - 2) / 2 ; i >= 0; i--){AdjustDown(arr, size, i);}for(i = size - 1; i > 0; i--){     int temp = arr[0];arr[0] = arr[i];arr[i] = temp;AdjustDown(arr, i, 0);}
}

算法非常简短,首先建立一个大根堆,然后每趟排序堆顶和堆尾进行交换,再用一个向下排序算法恢复大根堆即可实现。






具体步骤

完整代码

void AdjustDown(int *arr, int size, int root)
{int parent = root;int child = parent * 2 + 1;while(child < size){if(child + 1 < size && arr[child] < arr[child + 1]){++child;}if(arr[child] > arr[parent]){int temp = arr[parent];arr[parent] = arr[child];arr[child] = temp;}elsebreak;parent = child;     child = parent * 2 + 1;}
}void HeapSort(int *arr, int size)
{int i = 0;for(i = (size - 2) / 2 ; i >= 0; i--){AdjustDown(arr, size, i);}for(i = size - 1; i > 0; i--){     int temp = arr[0];arr[0] = arr[i];arr[i] = temp;AdjustDown(arr, i, 0);}}

数据结构与算法 | 堆排序相关推荐

  1. 数据结构排序算法实验报告_数据结构与算法-堆排序

    堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点,堆排序的时间复杂度为O(nlogn).( ...

  2. 数据结构和算法 堆排序 (图解堆调整)

    什么是堆? 堆:是一种特殊的序列 并且 将该序列想象为 完全二叉树 元素满足: (ki <= k2i && ki <= k2i+1) 每个结点一定比它的左右孩子小 这种堆称 ...

  3. 【数据结构和算法16】堆排序

    堆排序,顾名思义就是利用堆这个数据结构对数据项进行排序.前面提到过.堆数据结构中.节点大于或等于自己的子节点.那么我们能够将待排序的数据项依次加入到堆中,然后再依次取出根节点就可以.从堆中取出的数据项 ...

  4. 数据结构与算法 / 排序算法 / 堆排序

    一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...

  5. 数据结构与算法之堆排序

    数据结构与算法之堆排序 目录 堆排序介绍 代码实现 1. 堆排序介绍 堆排序(Heapsort)是指利用堆((英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组 ...

  6. Python天天美味(32) - python数据结构与算法之堆排序

    1. 选择排序 选择排序原理是先选出最小的数,与第一个数交换,然后从第二个数开始再选择最小的数与第二个数交换,-- def selection_sort(data):     for i in ran ...

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

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

  8. java堆排序图解_108-堆排序的思路图解_清华毕业老程序员亲授通俗易懂的Java数据结构和算法​​​​教程_Java视频-51CTO学院...

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  9. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

最新文章

  1. 1. 训练集、开发集、测试集(Train/Dev/Test sets)
  2. Linux 与win双系统时间不统一的解决方法
  3. 设计模式(五)责任链模式
  4. 二、源代码=程序集及程序集概念介绍
  5. Hadoop1.x中HDFS工作原理
  6. 车机没有carlife可以自己下载吗_路咖评:新宝骏的车机系统 革了百度Carlife的命?...
  7. HDU1233 还是畅通工程【Kruskal算法+并查集】
  8. 操作系统原理-----进程同步与通信
  9. CentOS官方免费下载地址,包含CentOS7和CentOS8
  10. 报表设计器——设计自己的报表
  11. 微信小程序 index.js获取app.js异步请求的动态数据
  12. 微信小程序电商项目商品详情页开发实战之数据绑定与事件应用
  13. 读《Google软件测试之道》笔记---SWE,SET,TE职责
  14. 数字图像处理(第四版)-冈萨雷斯-学习过程的笔记
  15. linux abs函数怎么用,Linux输入子系统详解
  16. 第九章 AT32F403A基于V2库串口 dma接收不定长数据
  17. html ajax 上传进度条,ajax文件上传 带 进度条
  18. JAVA ssm b2b2c多用户商城系统源码
  19. 暗物质组成原理当然是不存在计算机,关于引力子和暗物质的猜想,暗物质不存在!关注跃迁理论很重要...
  20. android实现猜扑克牌小游戏(改进:每次只可以选择一张)

热门文章

  1. spring配置详解-scope属性
  2. python脚本语言是什么意思_python为什么是脚本语言
  3. yii2 关掉php notice,yii2关闭错误提示
  4. 搜索专题:bfs和dfs
  5. linux编译安装mysql5.1.x
  6. Vue 2.3、2.4 知识点小结
  7. 『教程』Batch Normalization 层介绍
  8. 《用友ERP-U8(8.72版)标准财务模拟实训》——导读
  9. 设计模式(Design Patterns)详解
  10. 【SpringMVC】SpringMVC基础-SpringMVC项目快速搭建、日志框架为logback