堆排序算法C++实现

使用C++模版实现堆排序算法 合并排序具有较好的运行时间复杂度O(nlogn),但却需要额外的O(n)的空间;插入排序不需要开辟新的空间,但其时间开销却维持在O(n^2)。这两种算法各有所长,但都不尽如人意,综合看来:不是用时间买空间,就是用空间换时间。有没有这样一种集众家所长的算法?既保持一个较好的时间复杂度,又不必开辟额外的空间。堆排序无疑是不二选择。    以下即是用模版实现的堆排序的算法。 #include 阅读详情

堆排序

#include <iostream>
#include <vector>

using namespace std;

void heapify(vector<int>& nums, int n, int i) {
	int largest = i;             //当前需要调整为堆结构的节点
	int lson = i * 2 + 1;  
	int rson = i * 2 + 2;

	if (lson < n && nums[lson] > nums[largest]) {
		largest = lson;
	}
	if (rson < n && nums[rson] > nums[largest]) {
		largest = rson;
	}

	if (largest != i) {
		swap(nums[i], nums[largest]);
		heapify(nums, n, largest);
	}
}


void heapSort(vector<int>& nums, int n) {
	//建堆
	for (int i = n / 2 - 1; i >= 0; --i) {  
		heapify(nums, n, i);  //对所有具有子节点的节点构建堆排序
	}
	//排序
	for (int i = n - 1; i > 0; --i) {
		swap(nums[i], nums[0]);
		heapify(nums, i, 0);  //将最大的节点换到最后一个位置,并在下次调整时不考虑
	}
}

int main() {

	vector<int> nums = { 1, 2, 4, 5, 3, 3, 8, 6 };
	heapSort(nums, nums.size());

	for (int& i : nums) cout << i << " ";

}
c++模板类实现算法堆排序 假设为升序, 构建大堆 每次交换第一个和最后一个元素, 使最大元素沉底, 再对剩下元素进行建大堆 .h: #include //利用vector容器实现堆 template class HeapSort { public: HeapSort( ) //默认构造函数 {} HeapSort( T* a, size_t n ) 阅读详情

相关推荐

C++实现堆排序算法

1.实现堆排序算法       用C++实现一个堆排序。 2.实现思想 ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区  ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换, 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key 。 ③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序...

程序猿老樊的博客 3094

数据结构:常见的排序算法(五):堆排序(C++实现)

数据结构:常见的排序算法(五):堆排序 堆排序是一种树形选择排序,是对直接选择排序的有效改进。堆是一种特殊的树形数据结构,即完全二叉树。堆分为大根堆和小根堆,大根堆为根节点的值大于两个子节点的值;小根堆为根节点的值小于两个子节点的值,同时根节点的两个子树也分别是一个堆。 堆的定义下:具有n个元素的序列 (h1,h2,…,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,…,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由

qq_1628941121的博客 3896

C++堆排序算法实现与分析

最大堆是一种特殊的完全二叉树,它满足任何一个父节点的值都大于或者等于其子节点的值。最大堆通常被用来实现优先队列和堆排序算法。在最大堆中,最大元素总是位于根节点,这使得访问最大元素非常高效。堆的根节点存储在数组的第一个位置,对于任何位于数组索引i的元素,它的左子节点的索引是2*i + 1,右子节点的索引是2*i + 2,而它的父节点索引则是(i-1) / 2。堆排序算法的C++实现可以通过一个主函数来控制整个流程。首先,我们需要初始化一个数组,这个数组将作为堆排序的对象。

weixin_42629522的博客 743

【数据结构篇C++实现】- 堆

堆的规范化讲解,一文搞懂堆中所有知识

陈七的博客,学习知识分享,期待与大家的交流 3709

LangChain + Milvus Lite:从零搭建本地RAG知识库

本文详细介绍了如何利用LangChain、Milvus Lite和gte-large-zh模型,在本地从零搭建一个完整的RAG知识库系统。文章涵盖了环境配置、文档处理与向量化、本地向量库构建以及检索问答实现的全流程,重点突出了完全本地化部署带来的数据隐私安全和成本优势,为开发者提供了一条实践性极强的技术路径。

weixin_29044713的博客 443

保姆级教程:用Unity为麒麟系统打包Linux应用(含路径权限全攻略)

本文提供了一份详细的Unity跨平台开发指南,重点介绍如何在麒麟系统上打包和部署Linux应用。从开发环境配置、路径权限处理到性能优化和常见问题解决,全面解析了Unity项目在国产操作系统上的适配流程,帮助开发者高效完成跨平台应用开发。

weixin_28692867的博客 504

C++实现堆排序

C++实现堆排序

weixin_59566851的博客 5515

别再只改config了!YOLO/RT-DETR多通道输入实战:数据集结构、多卡训练与参数优先级避坑指南

本文详细解析了YOLO/RT-DETR模型在多通道输入(如8通道多光谱图像)中的实战应用,涵盖数据集结构优化、数据加载器改造、模型参数调优及多卡训练配置。针对常见的多通道输入报错问题,提供了系统的解决方案和性能优化技巧,帮助开发者高效实现非标准数据格式的适配与训练。

weixin_30955617的博客 397

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

学术类PPT制作总结

本文分享了科技类PPT的制作技巧,希望相关的信息能帮助到读者。

奇妙水果的技术博客,欢迎交流技术~ 2881

声纹识别初学

最近开始关注声纹识别技术,发现国内做这个的确实没有几家,而且大多重点推声纹认证,用在公安司法金融领域,而我却关注文本无关的声纹识别,这里把我搜到的一点资料汇总在此. 发现njustzj001的专栏有两篇文章适合入门的我,贴下链接: 综述:  http://blog.youkuaiyun.com/xmu_jupiter/article/details/47209961 PLDA解释:  http://

u013452331的专栏 2758

堆排序(C++实现)

堆排序(C++实现)

S13352784013的博客 2066

SONiC (6) - SONiC 源码框架分析

https://github.com/sonic-net/sonic-utilitieshttps://github.com/sonic-net/sonic-snmpagenthttps://github.com/sonic-net/sonic-linux-kernelhttps://github.com/sonic-net/sonic-platform-commonhttps://github.com/sonic-net/sonic-platform-daemons以下是在 SONiC 中运行的容器列表:

qq_49477505的博客 1332

C++堆排序算法实现

堆排序算法C++实现 #include <iostream> #include <vector> using namespace std; void maxHeap(std::vector<int>& in, int i, int size); void heapBuild(std::vector<int>& vec); void heapSort(std::vector<int>& in); void swap(std

strongman028的博客 222

内容审核与文本安全技术综述:检测、过滤与对齐

检测质量高度依赖数据。毒性/仇恨/冒犯语言检测领域形成了一批经典数据集,但它们的标签体系差异很大:例如 OLID(OffensEval)强调“是否冒犯—冒犯类型—目标对象”三层结构;HateXplain 在“hate/offensive/normal”三分类之外,还提供目标群体与人类标注的 rationale span;RealToxicityPrompts 则不做离散标签,而是用毒性分数来研究“模型续写时的毒性退化”。ACL 汇编。

nmdbbzcl的博客 1371

点云中概念:匹配、配准、融合

匹配,是寻找与一幅图相似的图像(不对寻找到的图像做矫正)。 配准,是寻找相似图像但是变形后的图像(需要做一些旋转之类的校正变换)。 融合,是多幅图像连接成一幅大图,视频集成中用的比较多。 1)匹配: 2)配准: 比如由于固定式激光雷达受测量方式的限制和被测物体集合形状的限制,固定的话一次只能扫描被测物体有限范围的点云数据(比如一个面??),这需要在多个视角下进行多次扫描(就是将激光雷达前后左右四个面都扫一下??对的),然而每个视角下得到点云数据都具有独立的坐标系,无法直接进行拼接(拼接就是将四个面

m0_37957160的博客 1万+

堆排序算法原理及C++实现(详细注释)

1、算法原理 原理部分参考下面这个博客即可: 堆排序算法(图解详细流程) 2、C++实现: 注意:heap_max这个函数调用了两次: 建堆时候和交换最大值之后分别调用一次: //注意:是把一个数组想象成了最大堆!!!!!! //利用最大堆这种数据结构进行排序:先构建个最大堆, //然后将根节点与数组最后一个元素交换,然后对剩下的N-1个元素进行迭代(建堆、交换) void heap_sort(v...

j879159541的博客 2263

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

堆排序算法的C++实现代码

先建立了一个小顶堆,代码解释参考上一篇博文,这里将数据成员设成了public以便在堆排序中访问。 排序算法很简单:每次取堆的堆顶数据也就是最小的数据,然后将这个数据删除,堆经过调整后又将最小数据放到的堆顶,循环便可。 #include #include

冒大烟的羊肉串的专栏 1191

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

排序算法 C++如何实现堆排序

堆排序基本思路 1、理解堆的特点,父节点总是大于(在总是小于)孩子节点。 父节点总是大于孩子节点的完全二叉树称为大根堆。 父节点总是小于孩子节点的完全二叉树称为小根堆。 2、每次把堆的最上面的值拿出来,再调整余下节点为新的堆。 3、拿n-1次后则完成排序。

filan的博客 261

c++堆排序算法的实现

//堆排序是一种选择排序,是一种不稳定的排序方法,基本思想是:以小根堆为例,首先,将要排序的数组创建为一个小根堆,然后,将小根堆的堆顶元素和无序区最后一个元素交换,并将无序区最后一个位置放入有序区,然后将新的无序区调整为小根堆。重复上述操作至结束。具体代码实现如下:   #include using namespace ::std; void MinTop(int number[],

yuncheng_cwb的专栏 584

C++索引从0开始的堆排序算法实现

最近算法群里有人问堆排序的问题,我一想没想出来,就又看看算法导论堆排那章,跟着敲了一遍,感觉印象算是深刻了一些。 堆排序的几个函数: 1.maxheap(nums[ ],int i) 首先我们数组从1开始编号,为了方便。即i为父节点,nums[i]的左右孩子分别为2i和2i+1,算算对不?这个函数假设i的左右子树都已经为最大堆,只有nums[i]这个根节点可能有问题,下面上代码: void max...

Fudanqqqqq的博客 467

C++ 堆排序算法实现

C++ 堆排序函数实现如下:void heap_sort(vector<int> &data) { for (int i = (int)data.size() / 2; i >= 0; i--) { heap_adjust(data, i, (int)data.size()); } for (int i = (int)data.size() - 1; i >

天下君的不老歌 546
上一篇: Linux下静态库和动态库的制作使用
下一篇: 插入排序C+++实现
zsiming
博客等级 码龄7年 43粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值