c++堆排序和堆

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用 DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。 阅读详情

hello😄

在c++里有很多排序方法,比如相对简单的  冒泡排序  选择排序  插入排序

还有 STL里的sort函数  手写快排  归并排序等

还有就是堆排序

这次主要说堆排序和堆

目录

堆是什么

最大堆

最小堆

堆排序

最终代码

关于堆


堆是什么

堆是一种特殊的完全二叉树

如果你是初学者,你的表情一定是这样的🤔

别想复杂

首先,你一定见过这种图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_12,color_FFFFFF,t_70,g_se,x_16

咱们暂时不管数字

这就是一个堆

堆又分为最大堆和最小堆

最大堆

看这张图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_20,color_FFFFFF,t_70,g_se,x_16

上面的节点的数都比下面的节点的数大,最上面的数是最大的,这就叫最大堆  

最小堆

还是一样的数,看这张图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_20,color_FFFFFF,t_70,g_se,x_16

这是一个最小堆,同最大堆,最上面的节点的数最小,上面的节点的数比下面的节点的数大

怎么样,是不是很简单?

堆排序

堆排序的基本思想是利用堆,使在排序中比较的次数明显减少使速度更快

堆排序的时间复杂度为O(n*log(n)), 非稳定排序,原地排序(空间复杂度O(1))。

堆排序的关键在于建堆和调整堆,下面简单介绍一下建堆的过程:

可以用STL下的

make_heap()

具体步骤:

第1趟将索引0至n-1处的全部数据建大顶(或小顶)堆,就可以选出这组数据的最大值(或最小值)。将该堆的根节点与这组数据的最后一个节点交换,就使的这组数据中最大(最小)值排在了最后。

第2趟将索引0至n-2处的全部数据建大顶(或小顶)堆,就可以选出这组数据的最大值(或最小值)。将该堆的根节点与这组数据的倒数第二个节点交换,就使的这组数据中最大(最小)值排在了倒数第2位。

…

第k趟将索引0至n-k处的全部数据建最大(或最小)堆,就可以选出这组数据的最大值(或最小值)。将该堆的根节点与这组数据的倒数第k个节点交换,就使的这组数据中最大(最小)值排在了倒数第k位。

其实整个堆排序过程中, 我们只需重复做两件事:

建堆(初始化+调整堆, 时间复杂度为O(n));

拿堆的根节点和最后一个节点交换(siftdown, 时间复杂度为O(n*log n) ).

因而堆排序整体的时间复杂度为O(n*log n)

没看懂可以看看这个图

 

最终代码

#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;
}


关于堆

C++中堆的应用:make_heap, pop_heap, push_heap, sort_heap

函数说明:
make_heap将[start, end)范围进行堆排序,默认使用less, 即最大元素放在第一个。

pop_heap将front(即第一个最大元素)移动到end的前部,同时将剩下的元素重新构造成(堆排序)一个新的heap。

push_heap对刚插入的(尾部)元素做堆排序。

sort_heap将一个堆做排序,最终成为一个有序的系列,可以看到sort_heap时,必须先是一个堆(两个特性:1、最大元素在第一个 2、添加或者删除元素以对数时间),因此必须先做一次make_heap.

scp 出现Permission denied错误 解决方法 第一种说辞(来源于网络),说是scp涉及root远程登录,默认是没有打开的,只需要把配置文件中的permit打开即可。最后scp的时候发现还不行,只需要将其scp的服务器用户名 修改为root即可。第二种解决方案,将scp 传输的服务器用户名改为root即可。(这是最基本的,一开始我忽视了这个问题,导致一直scp不了)window系统下,向ubuntu操作系统 scp传输文件。 阅读详情

相关推荐

信号转换为图像 时域频域分析

一维信号如何转化为图像?深度学习如何学习 1.当然,直接1d卷积也是可以的。 2. 以信号强度的数值作为纵坐标,以时间为横坐标绘制信号点就可以了。 周霖那个即是 要看看代码是如何做的, 即使是单导联 5000个点,怎么变成50005000的分辨率的 3. 直接把多通道的一维信号合并成二维图像,然后直接按图像卷积的方法去做~~ 2225000这样一个图 ~可以看看语音处理的相关Net,其中比较...

王不留行嘿呦嘿 2万+

C++算法:排序之三(堆排序)

堆排序算法的时间复杂度是O(NlogN),又是就地排序,所以应用范围很广。

攻城狮的博客 1217

手把手教你解决Windows 10网络驱动器无法访问问题(附详细排查步骤)

本文详细指导Windows 10用户解决网络驱动器无法访问的常见问题。通过从现象快速定位到系统排查,提供了从检查网络连通性、修复凭据权限到调整高级设置的完整步骤,特别是针对“找不到网络路径”等错误,帮助用户高效恢复对共享资源的访问。

weixin_29233857的博客 517

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

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

qq_1628941121的博客 3897

【Python学习日记:PySide6】【持续更新】

说明:PySide6 是 Qt for Python 的一部分,是一个 Python 绑定库,可以用来创建跨平台的 GUI 应用程序。它将 Qt 框架的丰富功能带到了 Python 环境中,允许开发者使用 Python 编写 GUI 应用程序。

XLQ的博客 8044

SD-WAN组网案例——数据中心

SD-WAN组网案例——数据中心

2301_78457663的博客 706

堆排序(C++)

堆排序(C++)

weixin_44806108的博客 4860

面向网络攻击行为可视化分析系统实现【WebSocket + 可视化】

本系统主要应用于网站运维管理,它解决了网站运维人员排查网络攻击行为复杂且繁琐等问题,提高了运维人员网络安全分析的效率和准确性。

oNew_Lifeo的博客 1621

C++之堆排

data++是C语言中的一个表达式,它会将指针data指向的地址向后移动一个存储单位的距离,这里一个存储单位指的是数组的元素大小。如果data是一个数组名,则它代表数组的首元素的地址。i--)// n/2是找到最后一个叶子的父节点在树中的位置,当i=1时,就说明此时在根节点处,在树中根节点是从1开始的 并不是0。需要注意的是,由于data是一个指向数组的指针,当使用data++表达式时,会改变指针指向的位置,因此建议在代码中使用时要小心。最小堆:根节点的值最小,任意节点的值都小于等于其左右子节点的值。

m0_74892619的博客 438

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战

本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。

weixin_30733003的博客 539

海思3559av100平台lan9500模块调试记录

1. 前言 通过USB2.0接口扩展一路百兆虚拟网口 2. 配置lan9500驱动 make ARCH=arm64 menuconfig 开启LAN95XX驱动,编译进内核 保存内核配置 3. 编译内核 make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- uImage -j 20 cd ../../arm-trusted-firmware/arm-trusted-firmware ./mk.sh cp ...

jzwjzw19900922的博客 908

【C++】十大排序算法之 堆排序 & 计数排序

排序算法是《数据结构与算法》中最基本的算法之一。

K1_uestc的博客 1460

2023年GESP12月认证C++五级真题解析

例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。

lan_in的博客 1007

c++ 堆和堆排序

堆是一种高效的二叉树数据结构,适用于需要快速获取最大/最小值的场景。堆排序是一种原地排序算法,空间复杂度 O(1),但它是不稳定排序。应用场景广泛,如优先队列、Top K 问题和多路归并等。

www_dong的博客 945

jre9下载 jdk9

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Data Structures in C++:堆和堆排序

堆的理论与实现、堆排序

水木年崋 363

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

c++ 堆和堆排序的基本实现

c++ 堆和堆排序的基本实现

qq_34179431的博客 364

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

堆和堆排序(c++代码实现)

1、堆和优先队列 优先队列 优先队列是一种特殊的队列,与普通队列相比,普通队列的特点是“先进先出,后进后出”而优先队列的出对顺序和如对顺序无关,与对内元素的优先级有关。 优先队列的主要操作:入队、出队(出队优先级最高的元素) 优先队列主要操作的实现方式 入队 出队 普通数组 O(1) O(n) 顺序数组 O(n) O(1) 堆 O(logn) O(logn) 从表中可...

weixin_42983849的博客 994

堆和堆排序(Heap Sort)以及堆排序的优化 —— C++

优先队列:出队顺序和入队顺序无关,和优先级相关 比如在医院看病,急诊病人优先,再比如在操作系统中执行任务,操作系统将动态的选择每一次优先级最高的任务进行执行 为什么选择优先队列:例如在1000000个元素中选出前一百名,在 n 个元素中选出前 m 个元素,排序算法的算法复杂度是O(nlog n)级别的,而使用优先队列,可以将其算法复杂度降低到O(nlog m)级别 优先队列的主要操作:入队,出队(...

点滴博客 1365

c++实现简单的建堆、维护堆和堆排序

// algorithms.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream" using std::cout; using std::endl; int heapSize; void maxHeapIFY(int *,int); void b

u010116320的专栏 1135

数据结构-堆和堆排序 C++实现

为什么使用堆 堆的主要用途是在处理优先队列上,相比于普通队列的先进先出,后进后出,优先队列出队顺序和入队顺序无关,只和优先级有关。比如头等舱登机就比普通乘客先登机,而和先来后到没有关系。但是有人会说我把数组先进行排序再处理呗,但是现实生活中往往是需要进行动态处理的,如果每次有新元素都要进行重新排序,那处理起来是十分复杂的。此时使用堆的数据结构处理速度会有一定的提升。 通过对比可以看出,虽然使用堆在入队和出队都不是最优,但是在同时出入队就会有较好的性价比。 如何实现堆 从上可以看出堆的时间复杂度为O(log

zhapeng1的博客 527

堆的操作和堆排序-最小堆实现递减排序-C++

#include #include #include using namespace std; //参考:http://blog.youkuaiyun.com/morewindows/article/details/6709644 //http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html void heapFixdown(int

Dave的架构师成长之路 1780

C++ 堆排序和堆的其他基本操作

在刷到一道堆的题目的时候又忘记怎么写堆了,如果不写成优先队列的话。所以破竹写这篇博客了记录堆得相应的写法。题目是leetcode215 首先heap的建立是:void build_max_heap(vector<int>& nums){ heap_size = nums.size(); for(int i = (heap_size >> 1) - 1; i >= 0;

Jason Zhou 663

数据结构和算法 堆排序 (图解堆调整)

什么是堆? 堆:是一种特殊的序列 并且 将该序列想象为 完全二叉树 元素满足: (ki <= k2i && ki <= k2i+1) 每个结点一定比它的左右孩子小 (孙子不一定) 这种堆称为 最小化堆(小堆) (树根是最小的) (ki >= k2i && ki >= k2i+1) 每个点一定比它的左右孩子大 (孙子不一定)这种堆称为 最大化堆(大堆) (树根是最大的) 堆排序(以最大化堆为例) 堆调整:排序之前需要将序列调整为 堆 (

Kiddyup的博客 9467

堆排序——C++实现

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

EricLee23 4426

数据结构——堆,堆排序

我们都知道内存分布中的出来的空间都在堆区上。和有一个名字很相近的数据结构——,虽然名称相近,但两者是完全不同的东西。因为十大排序算法中有一个,所以从头开始了解下这个数据结构, 终学习下。

qq_41596730的博客 1375

堆排序(递归)C++实现

堆排序(递归)C++实现 堆排序 使用堆的数据结构来进行排序,堆可以看成一个近似完全二叉树的顺序存储结构的数组 维护堆性质 维护堆的性质,对于给定的下标i,以i结点为根节点的堆左右子树都是最大堆,此时i对应结点的关键字可能小于其孩子节点,则违背了堆性质,通过向下调整使得这个堆满足最大堆的性质 堆调整算法选取根节点左右孩子关键字较大值与根节点交换,再递归进入被交换的左右孩子为根节点的堆,继续向下调整,直到当前的堆满足最大堆性质或者调整到叶子节点。 C++代码 void MaxHeap::maxHeapif

qq_44486439的博客 1166
上一篇: 没有标题 不要运行 是单独传代码的 看到划走
下一篇: unity3dButton组件详细用法
练习时长两年半的Programmer
博客等级 码龄5年 3万+粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值