堆排序算法及实现

1、堆排序定义

是一棵顺序存储完全二叉树

  • 其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆
  • 其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为根堆

举例来说,对于n个元素的序列{R0, R1, ... , Rn}当且仅当满足下列关系之一时,称之为堆:

  • Ri <= R2i+1 且 Ri <= R2i+2 (小根堆)
  • Ri >= R2i+1 且 Ri >= R2i+2 (大根堆)
大顶堆

 

堆特征:
  • 堆顶元素(完全二叉树的根)必为序列中n个元素的最小值或最大值
  • 堆中任何一个结点的非空左右子树都是一个堆
  • 根结点到任一个叶结点的每条路径上的结点值(关键字)都递减有序(或递增有序)

 堆排序需解决的2个问题

1、堆构建:如何由一个无序序列建成一个堆?

2、堆排序:如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆?

 2、堆构建

对待排序的记录,建成相应的完全二叉树从无序序列的第\left \lfloor n/2 \right \rfloor个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选。

3、堆排序 

定义:

将无序序列建成一个堆,得到关键字最小(或最大)的记录;

输出堆顶的最小(或最大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;

重复执行,得到一个有序序列,这个过程叫堆排序。

排序过程:

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

2、然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”。

 

4、算法实现 

#include <iostream>
#include <vector>using namespace std;//构建大顶堆
void HeapAdjust(vector<int> &list, int parent, int length){int temp = list[parent];					// temp保存当前父节点int child = 2 * parent + 1;					// 先获得左孩子while (child < length){// 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点if (child + 1 < length && list[child] < list[child + 1]){child++;}// 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点if (temp >= list[child]){break;}// 把孩子结点的值赋给父结点list[parent] = list[child];// 选取孩子结点的左孩子结点,继续向下筛选parent = child;child = 2 * parent + 1;}list[parent] = temp;
}//堆排序
vector<int> HeadSort(vector<int> list){int length = list.size();// 循环建立初始堆for (int i = length / 2 - 1; i >= 0; i--){HeapAdjust(list, i, length);}// 进行n-1次循环,完成排序for (int i = length - 1; i > 0; i--){// 最后一个元素和第一元素进行交换int temp = list[i];list[i] = list[0];list[0] = temp;// 筛选 R[0] 结点,得到i-1个结点的堆HeapAdjust(list, 0, i);cout << "第" << length - i << "趟排序:";for (int i = 0; i < list.size(); i++){cout << list[i] << " ";}cout << endl;}return list;
}void main(){int arr[] = { 6, 4, 8, 9, 2, 3, 1 };vector<int> test(arr, arr + sizeof(arr) / sizeof(arr[0]));cout << "排序前:";for (int i = 0; i < test.size(); i++){cout << test[i] << " ";}cout << endl;vector<int> result;result = HeadSort(test);cout << "排序后:";for (int i = 0; i < result.size(); i++){cout << result[i] << " ";}cout << endl;system("pause");
}

 运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/268028.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年度盘点:AIGC、AGI、GhatGPT、人工智能大模型必读书单

2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一年里集中出现&#xff0c;很容易混淆&#xff0c;甚至把人搞懵。 LLM&#xff1a;Large Language Model&#xff0c;即大语言模型&#xff0c;旨在理解和生成人类语言。LLM的特点是规模庞大&…

苹果IOS应用上架AppStore的流程与教程

快打包生成的苹果APP上架到苹果官方appstore商店的详细流程与教程 第一步&#xff1a;创建app发布证书以及配置文件 1、打开苹果开发者中心网站&#xff1a;https://developer.apple.com&#xff0c;点击右上角 Account 使用开发者账号登录&#xff0c;如下图所示&#xff1a…

七大排序动态图

1.冒泡排序 2.插入排序 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],…,array[i-1]已经排好序&#xff0c…

产品固件烧写方案

1、前言 一成熟的量产的嵌入式产品&#xff0c;软件一般分为BootLoader和App&#xff0c;BootLoader用于启动校验、App升级、App版本回滚等功能&#xff0c;BootLoader在cpu上电第一阶段中运行&#xff0c;之后跳转至App地址执行应用程序。 因此&#xff0c;在发布固件的时候&a…

css 表示具有特定类或者其他属性的某种标签类型的元素

需求 通过 css 选择器获取某种标签&#xff08;如&#xff1a;div、input 等&#xff09;具有某个属性&#xff08;如&#xff1a;class、id 等&#xff09;的元素&#xff0c;从而修改其样式。 代码 通过 [标签].[属性] 的方式来获取 <div class"test">&l…

传输层—UDP—校验和

传输层—UDP—校验和 学习一个协议&#xff0c;当然要掌握协议的特性&#xff0c;还需要理解协议报文格式。 UDP UDP 基本特点&#xff1a;无连接、不可靠传输、面向数据报、全双工 UDP报头包含&#xff1a;源端口、目的端口、UDP报文长度、校验和。 UDP载荷中&#xff1a…

C++STL算法库中谓词的使用

什么是c的谓词 谓词概念&#xff1a; 谓词函数是一个判断式&#xff0c;一个返回bool值的函数或者仿函数&#xff0c;有几个入参就是几元谓词。一般做一个函数的参数使用【引用自百度百科】。 常见的可以作为谓词的东西&#xff1a;函数、函数指针、函数对象、lambda表达式&am…

gprMax安装步骤

本来是想直接在base环境下直接弄的&#xff0c;但是报错了&#xff0c;因为base环境里的conda版本不匹配&#xff0c;于是重新建立虚拟环境gprMax&#xff0c;如下所示。 然后激活建立的gprMax环境&#xff0c;在gprMax环境中安装git 参考文章&#xff1a; https://zhuanlan.…

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…

小小的日志,大大的坑 | 京东云技术团队

1. 背景 压测过程中优化线程池以后单机qps存在性能瓶颈&#xff0c;优化过程中发现默认线程池及日志对性能存在严重的影响所以引发了一系列对日志优化的整理 2.哪些场景可能导致性能问题 在任何系统中&#xff0c;日志都是非常重要的组成部分&#xff0c;它是反映系统运行情…

pip指定优先从豆瓣源下载包

对于 Unix/macOS 系统&#xff0c;使用以下命令&#xff1a; pip config set global.index-url https://pypi.douban.com/simple/ 对于 Windows 系统&#xff0c;打开命令提示符或PowerShell&#xff0c;并使用相同的命令&#xff1a; pip config set global.index-url http…

部署Nextcloud详细步骤及优化方法

一、安装PHP8.0以上 我这里使用PHP8.0.30 [rootlocalhost ~]# php -v PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.30, Copyright (c) Zend Technologies [rootlocalhost ~]# 安装方法参考 二、安装MY…