堆排序

【数据结构】筛选法建堆 给你一个顺序表或数组(一串数据),通常来说建堆有两种方法一种**堆向上调整算法**,一种**堆向下调整算法建堆**也就是**筛选法**建堆。 筛选法建堆是一种快速建堆的方法,它是在堆排序算法中使用的。这种方法的基本思想是通过不断筛选节点,如果建大堆就将大的节点向上筛选,小的节点向下筛选,小堆就反之,最终得到一个有序的堆。 阅读详情
#include<stdio.h>
/*非递增排序*/

void swap(int k[], int i, int j)
{
	int temp;
	temp = k[i];
	k[i] = k[j];
	k[j] = temp;
}

void Heapadjust(int k[], int s, int n)
{
	int i, temp;
	temp = k[s]; //临时变量存放当前需要调整的双亲结点。
	for(i=2*s;i<=n;i*=2)  //2*s就是它的左孩子 每一次整完就进行下一个双亲结点(i*=2). 就是下一个左孩子为双亲结点。 
	{
		
		if(i< n && k[i]<k[i+1]) //双亲的左孩子和右孩子。如果右孩子比左孩子大的时候,i++; 最多使i指向最大元素的下标。i小于n确定i不是最后一个结点,要是的话,就没必要+1了嘛
		{
			i++;
		}
		if(temp>=k[i]) //如果temp 大于大的那个孩子的话,就可以跳出循环了。  这个调整的从上到下依次减小的堆。
		{
			break; 
		}
		k[s] = k[i]; //如果不是的话,那么双亲就要调整了,双亲等于大的孩子。
		s = i; //双亲的位置放在s里面。这个时候原来双亲的位置应该变换了。 
	}
	k[s] = temp;//把原来的双亲存放到应该属于它的位置。
}

void HeapSort(int k[], int n)
{
	int i;
	/*构造大顶堆*/
	for(i=n/2;i>0;i--) //从下往上,从右往左。只要把前0-n/2给调整好了二叉树就建立起来了。 
	{
		Heapadjust(k,i,n); // m:多大的长度  i:当前存放的双亲结点
	}
	for (i=n; i>1; i--)
	{
		swap(k,1,i);//将第一个元素和最后一个元素互换,随后就放在那里了,最后一个元素应该是最小的数字。
		Heapadjust(k,1,i-1); //这个时候只需要将第一个和数到I-1个数重新进行建堆。
	} 
}


int main()    
{    
    int i,a[10] = {5,6,2,3,7,9,4,1,3};    
    
    HeapSort(a,9);    
 

        
    for(i = 1; i<10; i++)    
    {    
        printf("%d\n", a[i]);    
    }    
    return 0;  
}   

堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。

堆排序也是属于选择排序的一种。

每次选择一个关键字需要log2N次比较。时间复杂度是nlog2n

怎么画堆呢? 很简单 一个个元素的画,而且按照层次来画,步骤如下:

所谓筛选法建立初始堆 一般是建立小顶堆 先将55放在第一个位置,再将63放在第二个位置,由于55比63小成立不用更换次序,再将44放在第三个位置,由于44比55小所以调换次序,现在次序为(44,63,55)再将38放在第四个位置,由于38比63小两者调换位置,又由于38比44小所以将38与44再调换位置得到次序为(38,44,55,63)再将75放在第五个位置,由于75比44大不用更换,将80放在第六个位置,由于80比55大不用更换位置,现在次序为(38,44,55,63,75,80)再将31放在第七个位置,由于31比55小调换位置,31又比38小再调换位置,现在次序为(31,44,38,63,75,80,55)最后将56放到第8个位置,由于56比63小调换位置,56比44大,不用调换位置由此得到次序为(31,44,38,56,75,80,55,63)

堆适合于记录比较多的文件中.

堆排序在最坏的情况下,其时间复杂度也为O(n*log2n)。

堆的空间复杂度: O(1).

堆排序算法之初始堆建立总结 堆排序算法之初始堆建立总结@(算法学习)关于堆的插入和删除有过一篇思考,但是关于初始堆的构建,没有总结。简单说就下面几个要点(以大顶堆为例): 首先根据序列构建一个完全二叉树 在完全二叉树的基础上,从最后一个非叶结点开始调整:比较三个元素的大小–自己,它的左孩子,右孩子。分为三种情况: 自己最大,不用调整 左孩子最大,交换该非叶结点与其左孩子的值,并考察以左孩子为根的子树是否满足大顶堆的要求,不满 阅读详情

相关推荐

用筛选法求100以内的素数

筛选法就是“埃拉托色尼筛法”,方法是在纸上写出1~1000的全部整数,然后逐个判断他们是否为素数,挖掉非素数,剩下的就是素数。 算法思想: 1、挖掉1 2、用下一个未被挖掉的数p除p后面各数,把p的倍数挖掉 3、检查p是否小于√p的整数部分,如果是,则返回2继续执行,否则结束 4、剩下的数就是素数 代码: #include<cstdio> #include<math.h> int main(){ int a[101],n=0; for(int i=1;i<=100;i++

m0_46289162的博客 4579

堆排序之建初始堆

在牛客网上看到一道题 答案是c,但是之前只接触插入法建堆,没了解筛选法建初始堆,于是网上冲浪,查找了一波解析,于是有了现在这个思路总结(看半天也没有看到比较靠谱的代码),然后总结了一下,按照这种思路,能得到C答案,但仍然存在一点疑惑(初始堆难道不应该是大顶堆或者小顶堆嘛,这结果也不是呀,还是说,有什么定义我不知道?求解),需要再去看看书。。。 最终还是觉得答案是错的,按照概念重新更正了图解...

学习小记 4万+

CodeBuddy 接入 MCP,一键生成网站!

2024 年 11 月,Anthropic 公司搞了个挺有意思的新玩意 - Model Context Protocol(模型上下文协议)简称为 MCP 协议。简单来说,它就是给 AI 和各类工具数据之间搭了个标准化的”桥梁”,让开发者不用再为对接问题头疼了。mcp.so如下图所示,这是 mcp.so 网站中的 MCP Server。使用百度/高德地图分析旅线计算时间接 Puppeteer 自动操作网页使用 Github/Gitlab 让大模型接管代码仓库。

悟空聊架构的专栏 1946

堆排序(选择类排序)

目录一、堆的定义二、堆与序列的关系三、算法思想3.1 建立初始堆3.2 重建堆3.2.1 过程分析3.2.2 算法实现3.3 堆排序 第一次循环 第二次循环 第三次循环

狂放不羁霸的博客 8296

THB6128步进电机驱动芯片介绍

THB6128芯片也称为步进电机驱动芯片,采用BiCDMOS工艺,IC管脚间距为1mm的小型MFP30KR封装而成。

weichen_78的博客 7182

CANoe实战:手把手教你用J1939.dbc发送超8字节长帧报文(附完整CAPL代码)

本文详细解析了使用CANoe和J1939.dbc实现超8字节长帧报文的分包发送技术,提供完整的CAPL代码实现与优化策略。内容涵盖J1939.dbc配置、分包发送模块设计、接收端处理逻辑,并与ISO 15765-2协议进行深度对比,帮助开发者构建高效可靠的商用车通信解决方案。

weixin_29169899的博客 393

堆排序详解

摘要:堆排序是一种效率非常高的排序算法,同时它的理解以及书写方式都是比较复杂的,以至于很多企业在进行面试的时候都喜欢考察堆排序的书写速度,而堆排序在项目应用中也是有着广泛的天地,因为它的高效率,使得很多数据统计场合都会有堆排序的身影。...

云杉木屋 9165

HDMI接口协议

接口HDMI(High-Definition Multimedia Interface),新一代多媒体接口标准。即高清多媒体接口。它能够同时传输视频和音频,简化了设备的接口和连线;同时提供了更高的数据传输带宽,可以传输无压缩的数字音频及高分辨率视频信号。HDMI 1.0 版本于 2002 年发布,最高数据传输速度为 5Gbps;而2017 年发布的 HDMI 2.1 标准的理论带宽可达 48Gbps。1、能够同时传输视频和音频,简化了设备接口与连线。2、提供了更高的数据传输带宽,

weixin_42581439的博客 2594

【数据结构】堆排序的实现

堆排序详细解析!你好,欢迎光临媛仔的数据结构进阶之路~

vpurple_的博客 1602

工业场景实战:基于YOLO与多格式标注的传送带异物检测数据集构建指南

本文详细介绍了基于YOLO与多格式标注的传送带异物检测数据集构建方法,涵盖数据采集、标注技巧(YOLO、COCO、VOC格式)、数据增强策略及实战案例。通过工业级解决方案,有效提升异物检测准确率与效率,适用于各类工业场景。

weixin_29168393的博客 463

在PyCharm中配置使用Anaconda环境

在PyCharm中配置使用Anaconda环境一、步骤1.Anaconda2.PyCharm总结 一、步骤 1.Anaconda 如未安装Anaconda可至其官网下载,学习使用个人版就可以了。 下载地址:https://www.anaconda.com/products/individual 1、打开Anaconda Navigator,点击Environments可以看到anaconda中已经有了默认的“base”环境,其中包含了大多数我们会用到的包,在PyCharm中可以直接使用该环境,而无需自行下载

TuckX的博客 19万+

详解堆排序

堆排序 1.堆排序基本介绍 (1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 (2) 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 (3) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 (4) 大顶堆举例说明: 我们对堆中的结点按层进行编号,映射到数组中就是下面这个样子: 大顶堆特点:arr[

xiaoshiguang3的博客 3107

【Java核心高阶进阶】44-Java8核心新特性

模块十:Java新特性演进 · 第 1 篇Java 8 是 Java 语言历史上最重要的一次发布,它引入的函数式编程范式从根本上改变了 Java 的编码方式。即便到了 JDK 21 的今天,Lambda、Stream、Optional 仍是日常开发的高频工具。本篇将深入这些特性的语法、原理与底层机制,帮助你不仅会用,更知其所以然。

gaochufukanyongren的博客 24

排序——堆排序

在复习堆排序之前, 首先我们需要回顾一下什么是堆。堆的本质其实是一个数组。它的物理结构本质上是一个数组。但是它的逻辑结构是一棵完全二叉树。我们在判断一个数组是否是一个堆的时候根据的就是它的逻辑结构。那么怎么根据它的逻辑结构判断是否是一个堆。首先堆的逻辑结构的二叉树的每一个孩子节点都大于它的每一个父亲, 就是堆。这种堆叫做小堆。如果它的逻辑结构的每一个孩子节点都小于它的父亲节点。它同样是个堆, 同时这种堆叫做大堆。

strive_mianyang的博客 1875

【以太网硬件十九】SGMII到底能不能直接出光模块?

详细解释为什么SGMII可以直接出光模块及其使用限制

highman110的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

堆排序之原地堆排序

之前介绍了堆排序,现在我们来聊聊原地堆排序 【代码】 //原地堆排序 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

qq_41033011的博客 1848

假人有限元模型

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

堆排序算法

一、堆排序算法基本思想 堆排序是利用堆数据结构而设计的一种排序算法,堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn),同时也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 如下图所示,其中大顶堆的性质**:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]** 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆,如下图所示,其中小顶堆性质:arr[i] <=

qq_44111805的博客 7774

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《堆排序》堆排序详解

堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图: //大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] //小顶堆:arr[i] <= arr[2i+1] &&

Zyy~的博客 5289

堆排序每一趟的结果_八大排序-堆排序(手写堆排序)

闲聊最近看完一个电视剧,猪脚是胃无限和难忘鸡。比较奇怪的是整个电视剧没有讲爱得死去活来的男女之情反而讲的是男男之间纯纯的知己之情(基情),不过别说还挺好看。有种感觉就像:天下人负你又如何,我定然站你这边...让我想到了当今社会的一些人,这类人习惯权衡利弊后“战队”,或察言观色后随波逐流不顾真理事实。这部剧表达的三观就像一股清流,人生难得一知己,让我内心颇有触动。很喜欢胃无限说的一句话:管他熙熙攘攘...

weixin_39917437的博客 4798

堆排序每一趟的结果_堆排序

本文介绍一种神奇的排序方法——堆排序。堆排序不像插入排序和归并排序那样直观,它利用了一种称为堆的数据结构。堆堆本质上是一个数组,但我们将其当做一个近似的完全二叉树来看待。树上的每一个结点对应数组中的一个元素,按层排列。除了最底层外,该树是完全充满的,而且是从左向右填充。下图(a)为我们想象中堆的结构,而(b)则是其实际存储形式。最大堆的特点是,每一个结点都比它的两个孩子结点大(如果孩子结点存在的话...

weixin_36462094的博客 6309

【堆排序回顾】堆排序的理解

文章目录堆排序堆排序有两种方法堆排序第一种实现思路——构造堆+排序:步骤一 :构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。步骤二 :将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。堆排序过程:代码:为什么说堆排序没有快速排序快?如何理解“堆”?要实现一个堆,先要知道,堆都支持哪些操作以及如何存储一个堆。1、往堆中插入一个元素2.删除堆顶元素 堆排序 堆排序有两种方法 方法一:前提.

NothingYCX的博客 1551

堆排序的原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33923762的博客 1735
上一篇: 选择排序
下一篇: 归并排序
PengPengBlog
博客等级 码龄10年 178粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值