堆排序原理及代码

news2024/10/24 11:24:58

文章目录

  • 🍊自我介绍
  • 🍊堆排序
    • 一、什么是堆?
    • 二、堆的分类
  • 🍊堆排序的思路
    • 一、构建大顶堆
    • 二、排序过程
  • 🍊堆排序代码


你的点赞评论就是对博主最大的鼓励
当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~


🍊自我介绍

  Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入式方面的内容。


🍊堆排序

一、什么是堆?

堆是一种类似完全二叉树的数据结构,可以分为大顶堆,小顶堆(也叫大根堆,小根堆),而堆排序就是基于这种结构而产生的一种程序算法。

二、堆的分类

分类
大顶堆:每个节点的值都大于或者等于其左右孩子的值。
小顶堆:每个节点的值都小于或者等于其左右孩子的值。

堆排序:若是需要进行堆排序的代码,一定需要先把树构建成大顶堆或者小顶堆,然后再进行排序。

🍊堆排序的思路

以下以数组 [4, 6, 8, 5, 9] 为例来梳理堆排序的思路。

一、构建大顶堆

  1. 首先明确完全二叉树的性质,对于数组中的元素,节点 i 的左子节点为 2 * i + 1 ,右子节点为 2 * i + 2 。
  2. 从最后一个非叶子节点开始调整,数组长度为 5,最后一个非叶子节点索引为 (5/2 - 1)=1 ,对应元素值为 6。
  • 以索引为 1 的节点(值为 6)为当前节点,左子节点索引为 3(值为 5),右子节点索引为 4(值为 9),比较三个值,9 最大,所以交换当前节点的值 6 和索引为 4 的节点的值 9。
  • 此时数组变为 [4, 9, 8, 5, 6] 。
  1. 接着处理索引为 0 的节点(值为 4)。
  • 左子节点索引为 1(值为 9),右子节点索引为 2(值为 8),比较三个值,9 最大,所以交换当前节点的值 4 和索引为 1 的节点的值 9。
  • 此时数组变为 [9, 4, 8, 5, 6] 。

经过上述步骤,大顶堆构建完成。

二、排序过程

  1. 此时堆顶元素 9 为最大值,将堆顶元素 9 与最后一个元素 6 交换。
  • 数组变为 [6, 4, 8, 5, 9] 。
  1. 由于交换后可能破坏了堆的性质,需要从堆顶开始调整堆,这里调整的堆大小为 4(因为已经确定了一个最大元素在最后位置)。
  • 以索引为 0 的节点(值为 6)为当前节点,左子节点索引为 1(值为 4),右子节点索引为 2(值为 8),比较三个值,8 最大,所以交换当前节点的值 6 和索引为 2 的节点的值 8。
  • 此时数组变为 [8, 4, 6, 5, 9] 。
  1. 重复上述过程,再次将堆顶元素 8 与当前未排序部分的最后一个元素 5 交换。
  • 数组变为 [5, 4, 6, 8, 9] 。
  • 调整堆,以索引为 0 的节点(值为 5)为当前节点,左子节点索引为 1(值为 4),无子节点,无需交换。
  1. 最后将堆顶元素 5 与当前未排序部分的最后一个元素 4 交换。
  • 数组变为 [4, 5, 6, 8, 9] 。

此时数组已经完全有序。堆排序完成。

🍊堆排序代码

#include <stdio.h>

void swap_data(int *x,int *y)
{
	*x ^= *y;
	*y ^= *x;
	*x ^= *y;
	return ;
}

//自调整构建大顶堆
void heap_adjust(int *arr,int start,int end)
{
	int father_node = start;
	int son_node = father_node * 2 + 1;


	while(son_node <= end)
	{
		//比较两个子结点,找到较大的字节
		if(son_node + 1 <= end && arr[son_node] < arr[son_node + 1])	
		{
			son_node ++;	
		}


		//若是父节点 > 子节点 ,表示调整完毕
		if(arr[father_node] > arr[son_node])
		{
			return ;	
		}else{ //交换负责父子内容,在继续子节点与孙结点比较
			swap_data(&arr[father_node],&arr[son_node]);
			father_node = son_node;
			son_node = father_node * 2 + 1;
		}
	}
	return ;
}

void heap_sort(int arr[],int len)
{
	int i = 0;
	//第一次建立大顶堆,找到从右到左,找到第一次非叶子结点
	//从后往前依次遍历
	for(i = len / 2 - 1;i >= 0;i--)
	{
		heap_adjust(arr,i,len - 1);	
	}

	//每次将根结点和最后一个结点交换,然后在调整
	for(i = len - 1;i > 0;i--)
	{
		swap_data(&arr[0],&arr[i]);	
		heap_adjust(arr,0,i - 1);
	}
}

void print_array(int a[],int plen)
{
	int i = 0;

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

int main()
{
	int a[] = {15,7,3,20,17,8};	

	int len = sizeof(a)/sizeof(a[0]);

	print_array(a,len);

	heap_sort(a,len);

	print_array(a,len);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

08 实战:色彩空间展示(本程序以视频为主)

程序效果如下: 我在这里讲解RGB和YCbCr的原理: 一、RGB颜色空间 1.1 基本概念 RGB颜色空间是一种最基础和常用的颜色表示方式,它基于人眼感知色彩的三原色原理。RGB分别代表: R(Red):红色G(Green):绿色B(Blue):蓝色通过这三种基本颜色的不同组合,可以产生人眼…

c#编写的各类应用程序、类库的引用(黑白盒)

001 课程简介&#xff0c;C# 语言简介&#xff0c;开发环境准备 (yuque.com)https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-001 一个Solution里包含多个Project 一、见识 C# 编写的各类应用程序 二、类库的引用&#xff08;黑/白盒引用&#xff09; 1、黑盒引用&a…

杨辉三角算法

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]]提示: 1 <…

2024ideaUI切换和svn与git的切换,svn的安装和配置,idea集成svn ,2024-10-18日

2024-10-18日 2024的UI实在很不舒服&#xff0c;隐藏了很多按键&#xff1b; 第一步&#xff1a; 视图 -》 外观 -》 工具栏选出来&#xff1b; 结果出来&#xff1a; 运行的按键和设置的按钮 第二步 点击设置的按钮&#xff0c;选择最后一个&#xff0c;重启就行 结果 舒服&…

LabVIEW提高开发效率技巧----用户权限控制

在LabVIEW开发中&#xff0c;用户权限控制是一个重要的设计模块&#xff0c;尤其在多用户系统中&#xff0c;它可以确保数据安全并控制不同用户的操作权限。为了实现用户权限控制&#xff0c;可以通过角色与权限管理模块来进行设计和实施。以下将从多个角度详细说明如何在LabVI…

Quarto ppt模板制作与Rstudio git连接

本篇记录下当前ppt演示中比较流行的quarto document使用情况以及Rstudio与git相连接的一些实操。 1 Quarto ppt模板制作 1.1 Quarto简介&#xff08;来自Kimi&#xff09; Quarto 是一个由 RStudio 的母公司 Posit 团队开发的开源科学和技术出版系统&#xff0c;它建立在 Pan…

Vue3 Composition Admin——基于 Vue 3 的现代化后台管理模板

Vue3 Composition Admin,这是一个基于 Vue 3 的现代化后台管理模板,旨在为开发者提供一个高效、灵活的开发基础。借助 Vue 3 的 Composition API,我们构建了一个可扩展的架构,使得代码更加清晰易读,同时提升了开发效率。 本项目集成了丰富的 UI 组件、动态路由管理和权限…

Android OpenGL光照效果

在计算机图形学领域&#xff0c;光照仿真是一个重要的研究领域&#xff0c;它对游戏画面的提升、电影和电视节目中的电脑生成图像&#xff08;CGI&#xff09;等方面产生了显著影响。通过使用不同的光照算法&#xff0c;我们可以改变场景的外观&#xff0c;例如模拟从白天到夜晚…

安装好的 Nginx 增加 nginx-module-vts 模块

目录 1. nginx-module-vts 准备 2.查看已安装的的 nginx 编译参数 3. 重新编译 nginx 添加 nginx-module-vts 模块 4. 验证 1. nginx-module-vts 准备 # 解压 unzip nginx-module-vts-master.zip # 将解压包移动到/usr/local/目录 mv nginx-module-vts-master /usr/local/ …

杭州威雅学校一席谈:企业家精神的传承

威雅一席谈 ABBEYTALK 《威雅一席谈》是杭州威雅学校为促进家校沟通推出的社区交流平台。我们将定期邀请家长代表分享自身经验与观点&#xff0c;通过真诚且深度的交谈探寻教育新契机。 本期一席谈&#xff0c;我们邀请了杭州威雅优秀学生家长Robin王先生。终身学习、工匠精神是…

Linux系统——dns域名解析

Linux系统——dns域名解析 一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record 二、DNS服务的配置1、正向解析的配置2、测试dns正常工作3、配置反向解析4、dns复制 三、DNS查询类型四、hosts文件的使用 一、dns域名解析介绍 dns&#xff0c;应用层协议 作用&…

arp代答观察

文章目录 代答和代理简述实验前提先不开启proxy代答的配置开启代答总结 代答和代理简述 ARP&#xff08;地址解析协议&#xff09;是在局域网中用于将IP地址映射到MAC地址的协议。在理解 ARP 代答和 ARP 代理之前&#xff0c;让我们先澄清一下 ARP 的基本工作原理。 ARP 代答&…

标题PLSQL 里面怎么在文件窗口下 ,创建文件夹,并做好常用sql语句的分类

标题PLSQL 里面怎么在文件窗口下 &#xff0c;创建文件夹&#xff0c;并做好常用sql语句的分类&#xff1f; 效果如图&#xff1a; 标题打开plsql,找到文件窗口 找到&#xff0c;窗口下的这个类似文件夹带扳手的这个图标&#xff0c;打开&#xff0c; 打开后&#xff0c;定位…

十一、pico+Unity交互开发教程——手指触控交互(Poke Interaction)

一、XR Poke Interactor 交互包括发起交互的对象&#xff08;Interactor&#xff09;和可被交互的对象&#xff08;Interactable&#xff09;。XR Interaction Toolkit提供了XR Poke Interactor脚本用于实现Poke功能。在LeftHand Controller和RightHand Controller物体下创建名…

LeetCode做题笔记第202题:快乐数

题目描述 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 1.对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 2.然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 3.如果这个过程 结…

「C/C++」C++ STL容器库 之 std::set 唯一键的集合容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

小鹏汽车股价分析:看涨信号已出现,技术指标显示还有40%的上涨空间

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;小鹏汽车的股价过去几天有所回落。 &#xff08;2&#xff09;随着需求的上升&#xff0c;该公司的业务发展的还算不错。 &#xff08;3&#xff09;猛兽财经对小鹏汽车股价的技术分析&#xff1a;多头已经将目标指向15…

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力 关键词提炼 #Neurosymbolic AI #神经网络 #符号推理 #感知能力 #逻辑能力 #认知水平 #智慧与力量 第一节&#xff1a;Neurosymbolic AI的类比与核心概念 Neurosymbolic AI就像是给神经网络这位“大力士”…

排序算法 —— 计数排序

目录 1.计数排序的思想 2.计数排序的实现 3.计数排序的分析 时间复杂度 空间复杂度 稳定性 优点 缺点 1.计数排序的思想 顾名思义&#xff0c;计数排序就是通过计数的方式来排序&#xff0c;其基本思想为&#xff1a; 开辟一个计数数组&#xff0c;统计每个数出现的次…

计算机毕业设计Hadoop+大模型在线教育大数据分析可视化 学情分析 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计

一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬勃发展&#xff0c;学习分析技术和自适应学习也在近年内得到了重大突破。在线教育是互联网技术与传统教育的结合&#xff0c;是当前中国教育信息化发展最快的领域&#xff0c;而当下最迫切的是有效整合教育资源和互联…