C++ 堆排序

C++:堆排序 目录 什么是堆排序: 堆排序步骤: 步骤一 、构造初始堆。将给定无序序列构造成一个大顶堆 步骤二 、将堆顶元素与末尾元素进行交换,使末尾元素最大。 最后结果: 再简单总结下堆排序的基本思路: 代码:  堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。 什么是堆排序:... 阅读详情

堆排序的原理:

堆是一棵完全二叉树,堆满足两个属性:

(1)堆的每一个父节点的值都大于(或小于)其子节点;

(2)树是完全平衡的,最底层的叶节点都位于最左边的位置上。

 

大顶堆:

(1)首先,通过“左右节点”与“父节点”不断地进行比较,得出最大值作为根节点,这样就形成了一个大顶堆。

(2)然后把最大值拿出来,放到后面的位置,这样元素就减少一个,之后再去重新建堆。

(3)不断的重复以上操作,最后就有顺序了。

#include <iostream>
#include <stdlib.h>
using namespace std;

/*******************************************/
/*  堆排序
/******************************************/

void swap(int &a, int &b)  //位置互换函数
{
	int temp = a;
	a = b;
	b = temp;
}


void Heap(int array[], int length, int index)  //堆排序算法(大顶堆)
{
	int left = 2 * index + 1;  //左节点数组下标
	int right = 2 * index + 2;  //右节点数组下标
	int max = index;  //index是父节点

	if (left < length && array[left] > array[max])  //左节点与父节点比较
	{
		max = left;
	}
	
	if (right < length && array[right] > array[max])  //右节点与父节点比较
	{
		max = right;
	}

	if (array[index] != array[max])
	{
		swap(array[index], array[max]);
		Heap(array, length, max);  //递归调用
	}
}


void HeapSort(int array[], int size)  //堆排序函数
{
	for (int i = size / 2 - 1; i >= 0; i--)  // 创建一个堆
	{
		Heap(array, size, i);
	}

	for (int i = size - 1; i >= 1; i--)
	{
		swap(array[0], array[i]);  //将array[0]的最大值放到array[i]的位置上,最大值往后靠
		Heap(array, i, 0);  //调用堆排序算法进行比较
	}
}


int main(void)  //主程序
{
	const int n = 6;  //数组元素的数量
	int array[n];
	cout << "请输入6个整数:" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}

	cout << endl;  //换行

	HeapSort(array, n);  // 调用HeapSort函数  进行比较

	cout << "由小到大的顺序排列后:" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << "Array" << "[" << i << "]" << " = " << array[i] << endl;
	}

	cout << endl << endl;  //换行

	system("pause");  //调试时,黑窗口不会闪退,一直保持
	return 0;
}

运行结果:

3DGS 2025实战指南:从安装到训练全流程解析 本文提供了3D Gaussian Splatting (3DGS) 从零开始的完整实战指南。详细解析了使用gsplat库进行环境配置、依赖安装(包括pycolmap和fused-ssim)、数据准备与COLMAP处理、核心训练流程及参数调优,并探讨了2025年3DGS在动态场景、可控编辑等领域的最新进展,帮助开发者快速掌握这一前沿3D重建技术。 阅读详情

相关推荐

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

堆排序(C++)

堆排序是简单选择排序的升级,两者思想相同,都是将一组无序的序列看作已排序部分和未排序部分,然后从未排序部分选择一个元素加入已排序部分,直到所有元素都完成排序。 不了解简单选择排序的朋友可以看一下这里: https://blog.youkuaiyun.com/Ivan_47/article/details/111772569 思路: 构造: 首先将序列中待排序的部分构造成一个堆。 堆即是一棵完全二叉树,此处用数组存储二叉树,根据二叉树的性质可知,结点 i 的双亲结点为 i / 2 、左子树为 2i、右子树为 2i+1(假

Ivan_47的博客 396

华为防火墙双线路配置实战:5分钟搞定主备自动切换(含健康检查避坑指南)

本文详细介绍了华为防火墙双线路配置实战,包括主备自动切换和健康检查机制的优化技巧。通过智能健康检查机制,华为防火墙能实现毫秒级故障自动切换,确保网络高可用性。文章提供了从架构设计到实战配置的全流程指南,并分享了常见配置误区与解决方案,帮助中小企业快速搭建稳定可靠的网络架构。

weixin_30872337的博客 605

堆排序——C++关于堆排序的库函数排序

C++中对于堆排序算法,其实是有一个专门的库函数:sort_heap void sort_heap (RandomAccessIterator first, RandomAccessIterator last,Compare comp); #include // std::cout #include // std::make_heap, std::pop_hea

黑盒子的博客 3312

别再硬啃C代码了!用Simulink的Matlab Function模块手把手教你搭建CRC8校验模型(附完整M脚本)

本文详细介绍了如何利用Simulink的Matlab Function模块轻松实现CRC8校验模型,替代传统的C代码编写。通过可视化建模和即时验证,开发者可以高效完成算法设计,并自动生成嵌入式代码。文章包含完整的M脚本示例和工程实践技巧,特别适合嵌入式系统开发人员提升工作效率。

weixin_42520661的博客 183

第二十六届中国机器人及人工智能大赛CRAIC决赛小型桌面级-立体仓储代码分享

国二奖,精度还有不少问题,没有视觉模块,单线程,比起其他大佬写的确实还有欠缺,继续加油吧。

qq_68232259的博客 691

(C++)堆排序的3个关键函数

堆排序:指使用堆结构对一个序列进行排序。所以,首先要有一个堆结构。 此处讨论递增排序。 注意:让存放堆的数组作为全局变量,n为元素个数,数组存放元素从下标1开始,n结束。 int heap[11] = {100,8,6,5,7,2,3,5,2,6,1}; int n = 10;//元素个数,也是最后一个元素的下标 1. 向下调整函数 一句话概括:层级下降,尽量举贤,直至不可降。 基本思想:总是将low结点和它的左右孩子比较,和左右孩子中较大的那个互换位置,互换之后仍不放过,继续和新的左右孩子

行步至春深 629

配置Dot1q终结子接口实现跨设备VLAN间通信示例

示例图 一.实验目的 1.配置Dot1q终结子接口实现跨设备VLAN间通信示例 二.注意事项 1.Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN Tag的报文, 收到不带VLAN Tag的报文会直接丢弃 2.由于三层以太网子接口不支持VLAN报文,当它收到VLAN报文时,会将VLAN报文当成是 非法报文而丢弃,因此,需要在子接口上将VLAN Tag剥掉,也就是需要VLAN终结 三.VLAN终结简介 1.VLAN终结的实质包含两个方面: ①.对接口接收到报文,剥除VLAN标

qq_44751470的博客 7097

C++实现排序算法之堆排序

一、算法思想 堆排序是利用堆性质进行的一种选择排序 概念: 堆:堆是一棵顺序存储的完全二叉树 每个节点的值都不大于其左右孩子节点的值的堆叫做小根堆(下左图) 每个节点的值都不小于其左右孩子节点的值的堆叫做大根堆(下右图) 设当前元素在数组中以R[i]表示,那么, (1) 它的左孩子结点是:R[2*i+1]; (2) 它的右孩子结点是:R[2*i+2]; (3) 它的父结点是:R[(i-1)/2]; (4) R[i] <= R[2*i+1] 且 R[i] <= R[2i+2]。 堆排序步骤如下:

qq_38307826的博客 4189

【CUDA编程部署教程】第一章:GPU架构与CUDA编程核心 1

我们将剖析现代GPU的计算心脏——流式多处理器(SM),理解其独特的Warp执行模型,探索Tensor Core带来的革命性矩阵运算加速,并深入探讨决定性能命脉的内存体系。当必须访问全局内存时,则必须遵循**合并访问(Coalesced Access)**的原则,即让一个Warp内的32个线程访问连续的内存地址,从而让硬件将多次访问合并为一次高效的内存事务,以充分利用带宽。SM的调度器以Warp为单位分派指令,在一个Warp内,所有32个线程在同一时刻执行完全相同的指令,但处理的数据不同,这种模型被称为。

VectorShift的博客 221

【忍者算法】从生活案例理解滑动窗口最大值:一个超直观的思路讲解|LeetCode 239 滑动窗口最大值

点此看全部题解更多干货,请关注公众号【忍者算法】,回复【刷题清单】获取完整题解目录~

忍者算法的博客 632

CPP 实现堆排序

int Swap(int &a,int &b) { int temp=a; a=b; b=temp; } void Heap_build(int a[],int root,int length) { int lchild=root*2+1; if(lchild<length) { int flag=lchild;...

跟随内心的渴望 777

【YOLOv13[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文将进行添加YOLOv13版本的升级版热力图可视化功能的实践,支持图像热力图可视化、优化可视化效果、 可以选择使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一个参数即可设置是否显示检测框等。

静谧、淡雅 646

C++堆排序

堆排序(Heap Sort)是一种基于二叉堆数据结构的比较排序算法,它是一种选择排序,可分为最大堆排序和最小堆排序,以下主要介绍最大堆排序。二叉堆的定义:堆排序的步骤: 代码解释 函数: 函数: 函数: 函数:堆排序是一种高效的排序算法,尤其适用于处理大量数据的情况,它在性能上较为稳定,并且不需要额外的存储空间。

doubleintfloat的博客 1516

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++堆排序模板

C++堆排序模板 #pragma warning(disable : 4996) #include<iostream> #include<vector> #define ARRAY vector<int> //下标从0开始有效 using namespace std; //调整最大堆(升序) void heapAdjust(ARRAY *ary, int r...

BlackCarDriver的博客 544

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++模板堆排序

堆排序简介堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。

上善若水 2246

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

c++堆排序和堆

hello😄 在c++里有很多排序方法,比如相对简单的 冒泡排序 选择排序 插入排序 还有 STL里的sort函数 手写快排 归并排序等 还有就是堆排序 其实堆就是完全儿

我的博客 2248

堆排序——C++实现

堆是完全二叉树的结构,因此对于一个有n个节点的堆,高度为O(logn),二叉堆是采用数组的方式来存储的,分为大顶堆和小顶堆两种: 大顶堆:根节点大于等于自己的两个孩子节点。 小顶堆:根节点小于等于自己的两个孩子节点。 堆排序总共分为两步: 1、初始化建堆: 找到一个树的最后一个非叶节点, 计算公式为 (n-1)/2 -1, 然后遍历树的每个非叶节点,使其符合堆的规则。 2、排序重建堆: 将堆的...

EricLee23 4426

C++堆排序的原理及实现

首先回顾下堆的数据结构的特点: 堆的描述 堆是一颗二叉树,这样的二叉树是局部有序的,任何节点与其兄弟节点之间都没有必然的顺序联系,但是它与父子节点之间有大小顺序关系,按照关系的不同,分为最大值堆和最小值堆: 最大值堆:子节点比父节点小的堆,根节点是树中最大的节点。 最小值堆:子节点比父节点大的堆,根节点是树中最小的节点。 堆是左平衡的树,所以随着节点的增加,树会逐级从左至右增长。因此对于一个堆来说,一个比较好的表示左平衡二叉树的方式是: 将节点通过水平遍历的方式连续存储到一个数组中。假设有一个零

DayDayUp 4042

C++算法之堆排序的代码

将开发过程中比较常用的内容段做个珍藏,如下的内容段是关于C++算法之堆排序的内容。 void heap_sort(int array[], int length) { if(NULL == array || 0 == length) return ; _heap_sort(array-1, length); } b)构建大堆和调整大堆...

weixin_44169010的博客 855

C++ 堆排序

// 堆排序-小堆排序 void SmallHeap(int arr[], int parent, int length) { int temp = arr[parent]; int child = parent * 2 + 1; while (child < length) { if (child + 1 < length && arr[child] > arr[child + 1]) { child++; // 如果左子节点大于右子节点,则当

u013114420的博客 277

【c++】堆排序算法

前段时间写过一个堆排序的小程序,现在来整理一下 我们以升序排序为例,先简单说一下堆排序的原理吧,就是不断维持一个大根堆,让每个结点都不小于其子节点,此时根节点必然是所有数字中最大的。然后,我们只需要将第一个与最后一个数字交换位置,就可将最大的数移动到数组的最后,然后再将数组前n-1个元素继续维护成大根堆,再将根节点与第n-1个元素交换位置,此时第n-1与第n个元素都已经按照升序排好了。我们只需要

sui2883517的博客 1154

c++十大排序——堆排序

1、堆排序 堆排序采用堆的这种数据结构,堆首先是一颗完全二叉树。 堆又分为大顶堆和小顶堆 大顶堆就是父节点数值大于等于左右节点数值 小顶堆是父节点数值小于等于左右节点数值 下标为i的节点的父节点下表为:(i-1)/2 下标为i的节点的左孩子下表为:i*2+1 下标为i的节点的右孩子下表为:i*2-1 #include<iostream> using namespace std; void sw(int &a,int &b) { int temp

yang_yi520的博客 1万+

C++排序 之 堆排序

以升序为例,堆排序简单来说就是先将原数组调整为大堆,此时根节点的数最大,最后一个叶子节点数最小,所以需将这两个节点的值进行交换,然后保证最后这个叶子节点的数不变,并从根节点开始往下调整,使除最后一个叶子节点之外的数维持大堆状态。同理,继续将调整后的根节点与倒数第二个叶子节点进行交换,然后完成以上操作,以此类推,直至调整到根节点。同时,因为堆排序基于二叉树的顺序结构存储,因此在代码编写中会利用二叉树的一些性质,若有不懂可见博主的博客。具体堆排序的理论只是可见博主的博客。...

m0_51961114的博客 385

cpp实现堆排序

【代码】cpp实现堆排序。

weixin_50569583的博客 285
上一篇: C++ 快速排序 —— 左右指针法
下一篇: C++ 归并排序
dong.x_辛旭东
博客等级 码龄9年 11粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值