简介:

  之前对堆排序认识的不是很透彻,今天回过头来再把堆排序的知识整理整理!以及排升序为什么要建大堆,排降序要建小堆。

正文:

  首先我们要知道:
  ①堆的逻辑是一颗完全二叉树;
  ②它使用的是顺序存储(也就是数组);
  ③它的作用:一般都是用于找最值。

排序也就是对数组的元素按照大小规则进行摆放。

堆排序的过程:
1、建堆
2、对建好的堆进行向下调整。

可能有人会疑问?堆已经建立好了,为什么还要向下调整?
来看看下面的解释:
我们先给定一个数组arr[ ] = { 7, 6, 3, 5, 4, 1, 2 }; 将其排成一个大堆。如下图:

  当我们建好堆之后,我们发现这个堆层序遍历下来是一个降序的。那么要将它变成一个升序的顺序,就要将它逆序。
  也就是交换堆顶和最后一个元素的位置,然后从堆顶开始向下调整,每交换一个位置,就多一个数据已经排好升序。
  可能看到这还很迷糊。没关系,继续看下面的图。


我们可以看到,排升序的话,使用大堆是非常方便的,我们每次向下调整都可以得到剩余数据的最大值,即堆顶元素。然后放到最后,使用分治的思想,每调整一次,要排序的数据就少一个。当交换到最后一个结点时,数组已经排好序了。
因为是从堆顶选择第一个元素与最后一个元素交换,所以堆排序实质上还是选择排序。

那么有人会疑惑为什么不使用小堆排升序呢?
我们再想想:首先使用堆排序主要是用堆顶元素,如果使用小堆排升序,此时堆顶的元素是最小的,当我们取出堆顶元素时,此时小根堆的性质就变了,那么下次就找不到第二小的元素了,还要重新建堆。所以不能使用小堆排升序。有兴趣的可以自己来画图走一走。


堆排序的代码如下:

void Swap(int *a, int *b)
{int tmp = *a;*a = *b;*b = tmp;
}
//建大堆
void AdjustDown(int arr[], int size, int root){int left = 2 * root + 1;int right = 2 * root + 2;int max;//没有左孩子if (left >= size){return;}//右孩子存在且大于左孩子if (right < size && arr[right] > arr[left]){max = right;}else{max = left;}if (arr[root] >= arr[max]){return;}Swap(arr + root, arr + max);AdjustDown(arr, size, max);
}
void CreateHeap(int arr[], int size){for (int i = (size - 1 - 1) / 2; i >= 0; i--){AdjustDown(arr, size, i);}
}
void HeapSort(int arr[], int size){CreateHeap(arr, size);for (int i = 0; i < size; i++){Swap(arr, arr + size - i - 1);AdjustDown(arr, size - i - 1, 0);}
}

堆排序(排升序为啥建大堆,排降序为啥建小堆)相关推荐

  1. 堆排序,为什么升序排列要建大堆,降序排列要建小堆

    堆排序中用到了建立大小堆和向下调整的内容,对这些内容有些不了解的同学可以去补一补专门写堆的博客,方便更好的理解堆排序数据结构之堆(Heap),堆的相关操作,用堆模拟优先级队列. 如果把待排序序列分为未 ...

  2. 【MySQL】九、数据排序(升序 order by ... asc,降序 desc),sql语句的执行顺序

    文章目录 1. 语法 2. 案例 (1)按照工资升序,找出员工名和薪资. (2)按照工资降序,找出员工名和薪资. (3)按照工资的降序排列,当工资相同的时候在按照名字的升序排列. (4)找出员工岗位是 ...

  3. 大数据学习笔记26:MR案例——双重排序(先按月份升序,再按利润降序)

    文章目录 一.提出任务 二.准备工作 1.启动hadoop服务 2.上传数据文件到HDFS 3.创建Maven项目DoubleSort 4.修改pom.xml文件,添加依赖 5.创建log4j.pro ...

  4. c语言找出最大值和最小值并按降序排输出,C语言用排序法给十个数降序排列,用C语言编写,输入10个数按降序排列...

    问题标题 C语言用排序法给十个数降序排列,用C语言编写,输入10个数按降序排列 2019-6-4来自ip:14.161.145.86的网友咨询 浏览量:562 手机版 问题补充: C语言用排序法给十个 ...

  5. 数据结构之堆排序(升序和降序)

    关于堆这种数据结构,可以观看这篇文章[数据结构之堆],要是不了解的话. 1 升序排序 升序排序使用最大堆,降序排序排序使用最小堆,并不是说只能这样用,只是这种设计会比较简洁. 这里以升序排序为例,每次 ...

  6. 关于Compartor接口中compare方法的升序,降序

    package com.itheima_03;//Compartor返回1,-1,0. // 1是前者权重大,-1是后者权重大,0表示二者权重相等.(o1表示前者,o2表示后者) //最后按照权重由小 ...

  7. js对象、数组对象根据属性值进行升序降序排序

    1.js对象排序 // 排序之前 let objs = {f: {id: 2,name: '2'},a: {id: 3,name: '3'},c: {id: 1,name: '1'} }// 根据对象 ...

  8. mysql按升序创建索引_MySQL8新特性:降序索引详解

    前言 MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升 ...

  9. python升序和降序排序_python中序列的排序,包括字典排序、列表排序、升序、降序、逆序...

    一.基础概念 我们知道python中的内建序列包括字典.列表.元组.字符串等,序列是python中最基本的数据结构. 列表.元组.字符串这类的序列的索引默认第一个元素的索引从0开始,第二个元素的索引是 ...

  10. 通过sort()方法实现升序和降序排列

    数组 升序:Arrays.sort(arr); 降序: 方法一:Arrays.sort(arr,Collections.reverseOrder()); 方法二: package com.yh.sor ...

最新文章

  1. 反汇编算法介绍和应用——递归下降算法分析
  2. 可视化生信分析利器 Galaxy 之 Docker 开发
  3. ajax在项目中怎么使用,我如何添加项目在sql中使用jQuery(ajax)通过web服务
  4. uc3842开关电源电路图_UC3842构成的开关电源电路
  5. M元上升子序列【树状数组+dp】
  6. 异常分发(内核异常)
  7. java抽象类与接口区别6_java基础知识(6)---抽象类与接口
  8. 深入剖析js命名空间函数namespace
  9. 初识Mysql(part1)--我需要知道的基本概念
  10. redhat rpmforge epel 安装源配置
  11. 《ArcGIS Runtime SDK for Android开发笔记》
  12. html5音乐播放器代码,html5简单迷你音乐播放器代码
  13. 数据结构与算法实验01-使用链表实现多项式乘法
  14. 摩尔线程与Ampere Computing达成合作
  15. VUE3 响应式 API 之 toRef 与 toRefs
  16. Like What Y ou Like: Knowledge Distill via Neuron Selectivity Transfer(2017)------论文阅读笔记
  17. 如何将域名地址转换成对应的IP地址?
  18. XMind8.0介绍与安装(破解)
  19. mysql统计数量函数方法_mySql关于统计数量的SQL查询操作
  20. CloudServer

热门文章

  1. 【牛客网】马三来刷题之数组单调和
  2. python车辆检测模型_使用OpenCV和Python构建自己的车辆检测模型
  3. Turbo-rack技术背景及简介
  4. rfid射频前端的主要组成部分有_RFID复习题目
  5. :幽灵蛛(pholcus)(三)--header get post学习资料
  6. UEditor定制工具栏图标
  7. Python+bs4实现爬取小说并下载到本地
  8. python数据统计分析兼职_招聘兼职数据分析师
  9. 用Python制作模拟人生4 Mod(01)
  10. java助教面试自我介绍,面试英语助教自我介绍