选择排序——堆排序

2023-10-30

一、堆排序的相关概念

 

1、堆的定义

从堆的定义可以看出,堆实质是满足如下性质的完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点。

2、堆排序的定义

若在输出堆顶的最小值(最大值)后,使得剩余n- 1个元素的序列重又建成一个堆,则得到n个元素的次小值(次大值) ... .如此反复,便能得到一个有序序列,这个过程称之为堆排序。

二、堆的调整

1、如何在输出堆顶元素后,调整剩余元素为一个新的堆?

以小根堆为例:

①输出堆顶元素之后,以堆中最后一个元素替代之 ;

②然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;

③重复上述操作②,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为"筛选"。

三、堆的建立

1、单结点的二叉树是堆;

2、在完全二叉树中所有以叶子结点(序号i > n/2)为根的子树是堆。这样,我们只需依次将以序号为n/2,n/2 - 1,......, 1的结点为根的子树均调整为堆即可。

即:对应由n个元素组成的无序序列,“筛选” 只需从第n/2个元素开始。

3、如下图所示是一个典例

4、堆的建立过程其实就是堆排序过程。

四、堆的算法描述

void HeapSort( elem R[] ) { //对R[1 ]到R[n]进行堆排序
int i;

for (i= n/2; i >=1; i--)

HeapAdjust( R,i,n); //建初始堆

for (i= n; i>1; i--){                //进行n-1趟排序
Swap(R[1], R[i]);                   //根与最后一 个元素交换

HeapAdjust(R,1,i-1);               //对R[1]到R[i -1]重新建堆
      }
} //HeapSort


void HeapAdjust (elem R[ ], int S, int m) {

/*已知R[s..m]中记录的关键字除R[s]之外均满足堆的定义,本函数调整R[s]的关键字,使R[s..m]成为一个大根堆*/

rc = R[s];

for (j=2*s;j<=m;j*= 2){                   //沿key较大的孩子结点向下筛选

if(j<m&&R[j] < R[j+1])   ++j;            //j为key较大的记录的下标

if( rc >= R[j] ) break;

R[s] = R[j];S =j;                     // rc应插入在位置s上

}//for

R[s] = rc; //插入

} // HeapAdjust

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择排序——堆排序 的相关文章

随机推荐

  • QT从入门到实战x篇_21_自定义控件封装(手动新增一个.ui文件;封装自定义组合控件;调用自定义控件;创建自定义控件间的功能关联;外部控件与自定义控件交流,创建自定义控件接口函数)

    前面几篇我们介绍了Qt自带的控件 本篇将会介绍如何自定义组合控件并创建接口为其他控件所使用的 在进行实际开发中 Qt自带的控件无法满足开发需求时 就需要通过对Qt控件进行封装实现自定义控件 1 首先创建名为 01 SmallWidget 的
  • [转]__declspec(dllexport) 和 __declspec(dllimport)

    declspec dllexport declspec dllexport 将一个函数声名为导出函数 就是说这个函数要被包含她的程序之外的程序调用 extern C 指示编译器用C语言方法给函数命名 在制作DLL导出函数时由于C 存在函数重
  • VMware Workstation Pro 虚拟机做RAID

    虚拟机添加两块硬盘 安装raid管理工具mdadm yum install y mdadm 查看磁盘情况 fdisk l 创建raid1 mdadm C dev md1 n 2 l 1 a yes dev sd b c 查看raid信息 c
  • linux下的串口调试工具安装及使用

    两行命令安装串口调试助手 如下 sudo apt get install cutecom sudo cutecom
  • 基础的复位电路

    目前在系统化的学习电路知识 因此将一些值得记忆的内容记录下来 方便查阅 单片机必须要设计一个复位电路 以防指针跑飞或是出现其他状况 由于系统初始化时 也需要一个过程 此时希望程序处于复位的状态 防止单片机误发命令 因此常用上图所示电路 以下
  • Hexo+Github博客搭建教程(个人操作过程)

    Hexo Github博客搭建教程 个人操作过程 最近自己尝试利用hexo github搭建了blog 来记录一下过程 一 准备环境 1 node环境 首先 安装 nodejs 因为Hexo是基于 Node js 驱动的一款博客框架 htt
  • MATLAB中fillmissing函数用法

    目录 语法 说明 示例 包含 NaN 值的向量 由 NaN 值组成的矩阵 插入缺失数据 使用移动中位数方法 使用自定义填充方法 包含缺失端点的矩阵 包含多个数据类型的表 fillmissing函数的功能是填充缺失的条目 语法 F fillm
  • 【Educoder作业】冯·诺依曼体系结构及工作原理理解

    Educoder作业 冯 诺依曼体系结构及工作原理理解 所有的那个实际场景模拟的题就不更了 没难度 趣味性更高 这个题和我们之前的一篇博客里面的题只一模一样的 链接 我们这里就不做任何讲解了 要说的那一篇里已经说过了 几天过去 有些程序的实
  • STM32F1软件仿真

    MDK 的一个强大的功能就是提供软件仿真 通过软件仿真 我们可以发现很多将要出现 的问题 避免了下载到 STM32 里面来查这些错误 这样最大的好处是能很方便的检查程序存 在的问题 因为在 MDK 的仿真下面 你可以查看很多硬件相关的寄存器
  • 1.Kubernetes(K8S)架构1(Master,Node和Pod)

    简介 K8S是当前主流的容器编排系统 服务编排系统要想实现服务的自动化部署和运行离不开容器编排系统 容器目的是解决服务器的异构问题 解决了部署的时候无需在考虑底层系统环境是否能够满足服务的需要 但是单独的容器并没有生产的价值 因为他只是提供
  • Jupyter Notebook的使用01—三种打开方式以及修改默认打开文件夹

    首先安装Anaconda 成功后 打开开始菜单会出现下图所示 方法一 1 点击 Anaconda Prompt 2 输入jupyter notebook 方式二 直接点击 Jupyter Notebook 也可以 创建桌面快捷方式 以后就可
  • js工具类合集(utils.js)

    目录 1 验证URL格式 2 获取当前日期或时间type date 获取日期 time 获取时间 3 日期 时间选择框转换字符串 4 格式化时间 5 随机生成32位数 6 前端分页展示数据 7 判断日期是不是今天 昨天 明天 8 坐标转化
  • GridControl 列合并(自定义分组条件)

    说明 当前方式不提倡 最好还是使用 1 主从表 或 2 分组 一 数据源 DataTable dta new DataTable dta Columns Add A dta Columns Add B dta Columns Add C d
  • Zookeeper伸缩性,Observer

    https blog csdn net gangsijay888 article details 82426540
  • C# 中分享重试控制

    1 首先 我想标准化处理 因为存在重试的情况 例如数据库相关处理 方法有返回值 所以我想两者都支持 我希望能够设置重试次数和重试间隔 public class RetryExecteUtil public static T Execute
  • ElasticSearch版本控制--java实现

    一 前言 最近工作中有这样一个ElasticSearch 以下简称ES 写入的场景 Flink处理完数据实时写入ES 现在需要将一批历史数据通过Flink加载到到ES 有两个点需要保证 对于历史数据 ES已有文档 则舍弃旧数据 ES没有则插
  • Unity 5 中的全局光照技术详解

    全局光照 简称GI 是一个用来模拟光的互动和反弹等复杂行为的算法 要精确的仿真全局光照非常有挑战性 付出的代价也高 正因为如此 现代游戏会先一定程度的预先处理这些计算 而非游戏执行时实时运算 同一场景里 没有照明 左 只有直接光源 中 和有
  • mapreduce编程实验报告

    MapReduce分布式计算系统 1 HDFS 分布式存储系统 2 MapReduce 分布式计算系统 3 YARN hadoop 的资源调度系统 Common 以上三大组件的底层支撑组件 提供基础工具包和 RPC 框架等 Map处理 pu
  • 算法篇-面试必刷Top2-链表内指定区间反转

    BM2 链表内指定区间反转 解题思路 头插法 在学会了BM1 反转链表之后 要解决这个问题就很简单了 前一题是整个链表反转 这一题是部分反转 这上一题就是这道题的前置问题啊 那我们肯定是要先找到了第m个位置才能开始反转链表 而反转的部分就是
  • 选择排序——堆排序

    一 堆排序的相关概念 1 堆的定义 从堆的定义可以看出 堆实质是满足如下性质的完全二叉树 二叉树中任一非叶子结点均小于 大于 它的孩子结点 2 堆排序的定义 若在输出堆顶的最小值 最大值 后 使得剩余n 1个元素的序列重又建成一个堆 则得到