#include<iostream>
#define LEFT(i) (i<<2)
#define RIGHT(i) ((i<<2)+1)
using namespace std;
void swap(int& small, int& big)
{
int temp = small;
small = big;
big = temp;
}
/*
|把父节点和两个儿子节点做比较,把最大数的下标值存入largest
|当父节点arr[root]比arr[leftchild]和ar[rightchild]时,
|函数heap_adjust退出。下一次找最大数就是从左儿子节点开始的,
|依次往下,比较父节点和子节点的大小。
*/
void heap_adjust(int arr[], int root, int size)
{
int leftchild = LEFT(root);
int rightchild = RIGHT(root);
int largest;
if (size < 1)
return ;
if ( leftchild <= size && arr[leftchild] > arr[root])
largest = leftchild;
else
largest = root;
if ( rightchild <= size && arr[rightchild] > arr[root])
largest = rightchild ;
/*
| 上面已经把父节点arr[root]和左右儿子节点做大小比较(arr[leftchild],arr[rightchild])
| 当arr[leftchild]或arr[rightchild]大于父节点时,就交换他们的位置,
| 此时这棵树就是最大堆
|
|但还要确保以孩子节点为根的子树也是最大二叉树堆,所以依次比较,也就是递归比较
*/
if ( largest != root )
{
swap (arr[root], arr[largest]);
heap_adjust(arr, largest, size);
}
}
/*
|序列中从arr[size/2+1]开始一直到arr[size-1]
|在映射到完全二叉树的过程中都为叶子节点,即都为一颗独立的二叉树
|且都是只包含一个节点(即自己本身)的完全二叉树
|
|所以在建树的时候,从arr[size/2 : 0]反向建树,
|这样可以确保在对构建完整的二叉树从上至下,从左至右,所遵循的次序
|与序列中从0 -> (size-1)的循序是对应的。
*/
void build_heap(int arr[], int size)
{
for (int i = size/2; i >= 0; i-- )
heap_adjust(arr, i, size);
}
/*
|首先调用build_heap()构建一个最大堆,映射到二叉树就是:
|映射每一棵二叉树上,父节点永远都是大于或等于子节点的。
|
|二叉树构建完成后,我们知道arr[1]永远是整棵树中最大的数
|所以把arr[1]和arr[last]交换,也就是把arr[1]这个最大数放到序列队位
|
|此时显然只需要比较前面last-1个数,也就是size -=1
|然后在剩余的last-1个节点中把次大树放到size-2的位置,也就是对应序列中倒数第二,次大数的位置
|
|依次迭代...
|
|直到还剩最后两个数,进行最后依次比较。
|
|由于每个函数都是传递的引用,所以对应大小次序的调整都直接是改变序列的。
|也就达到了排序的目的。
*/
void heap_sort(int arr[], int size)
{
build_heap(arr, size);
/*
|这里last>=2是因为在heap_adjust()中比较最后两个数的大小就可以
|而不需要把最后一个数自身与自身进行比较。
|显然这样减少了比较次数和函数调用的次数
*/
for ( int last = size; last >= 2; last--)
{
swap(arr[last], arr[0]);
size -= 1;
heap_adjust(arr, 0, size);
}
}
//创建最大堆
int main()
{
const int size = 10;
int iarray[size] = {15,3,4,9,25,60,87,88,92,5};
build_heap(iarray,size-1);
heap_sort(iarray, size-1);
for (int i = 0; i < size; i++ )
cout << iarray[i] << " ";
cin.get();
return 0;
}
相关推荐
ADC噪声参数博弈论:为何24位ADC的有效分辨率可能不如16位?
本文深入探讨了ADC噪声参数的核心矛盾,揭示了24位ADC有效分辨率可能不如16位ADC的根本原因。关键在于跳出单纯比较位数的误区,转而关注输入参考噪声这一绝对指标。文章通过分析参考电压对满量程范围和噪声模型的影响,阐述了动态范围与最小可测信号之间的取舍逻辑,为工程师提供了基于系统实际需求的ADC选型与噪声评估框架。
涂鸦-草稿:堆排序(2)
涂鸦-草稿:堆排序(2)
FPGA工程师必看:JESD204B同步机制实战指南(含SYSREF信号调试技巧)
本文为FPGA工程师提供了一份JESD204B同步机制的实战指南,重点聚焦于SYSREF信号的调试技巧。文章从同步的核心逻辑出发,深入剖析了时钟、SYSREF与对齐序列这“三驾马车”的协作,并详细阐述了硬件PCB布局、FPGA IP核配置、状态机监控以及使用示波器进行波形分析等关键实战步骤,旨在帮助工程师解决多通道高速系统中的同步难题,确保链路的稳定与确定性延迟。
堆排序详解
摘要:堆排序是一种效率非常高的排序算法,同时它的理解以及书写方式都是比较复杂的,以至于很多企业在进行面试的时候都喜欢考察堆排序的书写速度,而堆排序在项目应用中也是有着广泛的天地,因为它的高效率,使得很多数据统计场合都会有堆排序的身影。...
DeepSeek提示词实战:从零到百的AI角色扮演指南(附100+场景模板)
本文提供了一份详尽的DeepSeek提示词实战指南,重点讲解AI角色扮演的核心技巧。通过“角色扮演四要素法”和五大核心场景模板,帮助用户从零开始掌握如何设计高质量提示词,有效提升AI输出的深度与精度,并附赠100+实用场景模板供参考。
保姆级教程:用Ansible 2.9自动化配置华为ENSP路由器(附Cloud连接避坑指南)
本文提供了一份详细的Ansible 2.9与华为ENSP路由器自动化配置教程,涵盖环境搭建、网络连通性配置、Playbook开发及典型问题排查。特别针对Cloud连接常见问题提供避坑指南,帮助运维工程师快速掌握网络自动化技能,提升工作效率。
【数据结构】堆排序的实现
堆排序详细解析!你好,欢迎光临媛仔的数据结构进阶之路~
KUKA机器人与S7-1200 PLC实现Profinet通讯配置步骤详解
在工业自动化产线中,PLC与工业机器人之间的高效数据交换是控制逻辑落地的关键。传统硬接线方案在信号点多时布线复杂、故障排查困难,而现场总线技术通过一根网线即可实现主从设备间的周期通讯。Profinet作为主流工业以太网协议,由S7-1200作为IO Controller主站,KUKA机器人作为IO Device从站,在WorkVisual与TIA Portal中完成设备组态、I/O映射及信号分配,即可替代成捆电缆,稳定传输启停、状态及报警信号。这一方案适用于汽车、3C、物流等行业的自动化产线,尤其适合需要扩
排序——堆排序
在复习堆排序之前, 首先我们需要回顾一下什么是堆。堆的本质其实是一个数组。它的物理结构本质上是一个数组。但是它的逻辑结构是一棵完全二叉树。我们在判断一个数组是否是一个堆的时候根据的就是它的逻辑结构。那么怎么根据它的逻辑结构判断是否是一个堆。首先堆的逻辑结构的二叉树的每一个孩子节点都大于它的每一个父亲, 就是堆。这种堆叫做小堆。如果它的逻辑结构的每一个孩子节点都小于它的父亲节点。它同样是个堆, 同时这种堆叫做大堆。
基于stm32的智能空气加湿器设计(含源代码和Proteus仿真)
课程设计分享
Vivado2023.2与Vitis协同开发:从Hello World到BOOT.BIN的完整流程解析
本文详细解析了使用Vivado 2023.2与Vitis协同开发ZYNQ/MPSoC平台的完整流程。从环境安装、硬件设计、软件编写、在线调试到生成独立的BOOT.BIN启动文件,手把手指导开发者完成从Hello World到系统固化的全步骤,并提供了常见问题的避坑指南,帮助初学者快速掌握软硬件协同开发的核心技能。
堆排序之原地堆排序
之前介绍了堆排序,现在我们来聊聊原地堆排序 【代码】 //原地堆排序 template<typename T> void heapSort3(T arr[], int n) { //将数组构建成一个堆 for(int i = (n - 1) / 2; i >= 0; i--) { __shiftDown(arr, n, i); } for(int i = n - 1; i > 0; i--) { swa
从量子兔AlphaPi硬件拆解到ESP32-C3库开发实战
本文详细拆解了量子兔AlphaPi开发板的硬件构成,重点分析了其核心ESP32-C3芯片及外围传感器。通过逆向工程揭示了GPIO引脚定义与通信协议,并实战演示了如何从零开发MicroPython库,驱动按键、加速度计及LED点阵,最终整合成一个互动平衡球游戏项目,展现了开源硬件在教育与二次开发中的潜力。
详解堆排序
堆排序 1.堆排序基本介绍 (1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 (2) 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 (3) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 (4) 大顶堆举例说明: 我们对堆中的结点按层进行编号,映射到数组中就是下面这个样子: 大顶堆特点:arr[
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
堆排序算法
一、堆排序算法基本思想 堆排序是利用堆数据结构而设计的一种排序算法,堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn),同时也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 如下图所示,其中大顶堆的性质**:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]** 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆,如下图所示,其中小顶堆性质:arr[i] <=
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
《堆排序》堆排序详解
堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图: //大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] //小顶堆:arr[i] <= arr[2i+1] &&
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
堆排序每一趟的结果_八大排序-堆排序(手写堆排序)
闲聊最近看完一个电视剧,猪脚是胃无限和难忘鸡。比较奇怪的是整个电视剧没有讲爱得死去活来的男女之情反而讲的是男男之间纯纯的知己之情(基情),不过别说还挺好看。有种感觉就像:天下人负你又如何,我定然站你这边...让我想到了当今社会的一些人,这类人习惯权衡利弊后“战队”,或察言观色后随波逐流不顾真理事实。这部剧表达的三观就像一股清流,人生难得一知己,让我内心颇有触动。很喜欢胃无限说的一句话:管他熙熙攘攘...
堆排序每一趟的结果_堆排序
本文介绍一种神奇的排序方法——堆排序。堆排序不像插入排序和归并排序那样直观,它利用了一种称为堆的数据结构。堆堆本质上是一个数组,但我们将其当做一个近似的完全二叉树来看待。树上的每一个结点对应数组中的一个元素,按层排列。除了最底层外,该树是完全充满的,而且是从左向右填充。下图(a)为我们想象中堆的结构,而(b)则是其实际存储形式。最大堆的特点是,每一个结点都比它的两个孩子结点大(如果孩子结点存在的话...
【堆排序回顾】堆排序的理解
文章目录堆排序堆排序有两种方法堆排序第一种实现思路——构造堆+排序:步骤一 :构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。步骤二 :将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。堆排序过程:代码:为什么说堆排序没有快速排序快?如何理解“堆”?要实现一个堆,先要知道,堆都支持哪些操作以及如何存储一个堆。1、往堆中插入一个元素2.删除堆顶元素 堆排序 堆排序有两种方法 方法一:前提.
堆排序的原理
2019独角兽企业重金招聘Python工程师标准>>> ...
704



被折叠的 条评论
为什么被折叠?



