【数据结构】(6.3)堆的应用——堆排序(C语言)

系列文章目录

`


`

文章目录

  • 系列文章目录
  • 前言
  • 1. 堆排序的基础知识
  • 2. 堆排序详解
    • 2.1 堆排序整体思路
    • 2.2 思路详解
      • 2.2.1 建堆
      • 2.2.2 堆排序完整代码
      • 2.2.3 输出数据
  • 3. 时间复杂度分析


前言


1. 堆排序的基础知识

堆排序(Heap Sort)就是对直接选择排序的一种改进。此话怎讲呢?直接选择排序在待排序的n个数中进行n-1次比较选出最大或者最小的,但是在选出最大或者最小的数后,并没有对原来的序列进行改变,这使得下一次选数时还需要对全部数据进行比较,效率大大降低。

堆排序算法是Floyd和Williams在1964年共同发明的,同时他们发明了“堆”这种数据结构。

2. 堆排序详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0q6qLBDQ-1720192659452)(https://i-blog.csdnimg.cn/direct/0f2c72ccbaf94cb6b82fcf98db94d75b.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pho8P4Lh-1720192659453)(https://i-blog.csdnimg.cn/direct/276d4ccb5e3648eeb46bdd8931a2563e.png)]

2.1 堆排序整体思路

1):给出待排序的数组,咱们脑补一个逻辑结构,然后将该逻辑结构整体调整为大堆或者小堆(建堆)

2): 留个问题:降序构建大堆还是小堆呢?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wF53FEr1-1720192659453)(https://i-blog.csdnimg.cn/direct/fe41635d2ec449d5a704a324e1a82319.png)]

3):打印输出数据。

2.2 思路详解

2.2.1 建堆

以大堆为例哈:既然前面都铺垫了向下调整算法,你们肯定猜到了是通过该算法来建堆啦。

注意该算法的使用前提:要求左右子树都是大堆。怎么办呢?聪明如你们,我们从逻辑结构的后面往前面用该算法不就行啦!!

2.2.2 堆排序完整代码

#include <stdio.h>
//实现交换
void Swap(int* pa, int* pb)
{int tmp = *pa;*pa = *pb;*pb = tmp;
}
//向下调整法
void AdjustDown(int* arr, int n, int root)
{//双亲的下标int parent = root;//较大孩子的下标,默认为左孩子int child = parent * 2 + 1;//如果孩子的下标不越界,进入循环while (child < n){//如果右孩子存在(下标没越界),并且右孩子大于左孩子,更新childif (child + 1 < n && arr[child + 1] > arr[child]){child = child + 1;}//如果较大的孩子大于双亲,交换if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);//改变parent的下标如果满足条件继续向下调整parent = child;child = parent * 2 + 1;}//如果较大的孩子不大于双亲,root节点的大堆构建完毕else{break;}}
}
void HeapSort(int* arr, int n)
{//循环从后面往前面对需要的数组元素使用向下调整算法int i = 0;//向下调整次数	(n-1-1)/2for (i = (n - 1 - 1) / 2; i >= 0; i--){//向下调整AdjustDown(arr, n, i);}
}int main()
{//待排序的数组int arr[] = { 6,4,2,8,3,1,9,7,5,0 };//调用主体函数HeapSort(arr, sizeof(arr) / sizeof(arr[0]));//打印数据PrintArray(arr, sizeof(arr) / sizeof(arr[0]));return 0;
}

2.2.3 输出数据

这部分比较简单,不多分析。

3. 时间复杂度分析

堆排序的时间复杂度分析,应该是排序算法中最复杂的,需要具备高中的基础知识!!!!

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

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

相关文章

04通俗理解自注意力机制(self-attention)

04浅谈自注意力机制&#xff08;self-attention&#xff09; 1. 基本概念 注意力机制 是Transformer模型的核心。它的作用是让模型能够“关注”输入数据的不同部分&#xff0c;而不是一次只处理一个词。比如&#xff0c;当模型在处理一句话时&#xff0c;它可以同时考虑句子中…

2024攻防演练:亚信安全新一代WAF,关键时刻守护先锋

实网攻防 网络安全如同一面坚固的盾牌&#xff0c;保护着我们的信息资产免受无孔不入的威胁。而其中&#xff0c;WAF就像网络安全的守门员&#xff0c;关键时刻挺身而出&#xff0c;为您的企业筑起一道坚实的防线。 攻防不对等 防守方实时应答压力山大 在攻防对抗中&#xf…

day04-matplotlib入门

matplotlib Matplotlib 提供了一个套面向绘图对象编程的 API接口 是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行 它能够根据 NumPyndarray 数组来绘制 2D(3D) 图像&#xff0c;它使用简单、代码清晰易懂&#xff0c;深受广大技术爱好 者喜爱。 实列&…

Django学习第五天

启动项目命令 python manage.py runserver 图像验证码生成随机字母或者数字 import random from PIL import Image, ImageDraw, ImageFont, ImageFilterdef check_code(width120, height40, char_length5, font_fileZixunHappyBold.ttf, font_size28):code []img Image.new…

liunx离线安装Firefox

在Linux系统中离线安装Firefox浏览器&#xff0c;您需要先从Mozilla的官方网站下载Firefox的安装包&#xff0c;然后通过终端进行安装。以下是详细的步骤&#xff1a; 准备工作 下载Firefox安装包&#xff1a; 首先&#xff0c;在一台可以上网的电脑上访问Firefox官方下载页面…

Spring框架Mvc(2)

1.传递数组 代码示例 结果 2.集合参数存储并进行存储类似集合类 代码示例 postman进行测试 &#xff0c;测试结果 3.用Json来对其进行数据的传递 &#xff08;1&#xff09;Json是一个经常使用的用来表示对象的字符串 &#xff08;2&#xff09;Json字符串在字符串和对象…

实证Stata代码命令汇总

实证Stata代码命令汇总 更新时间:2024.4 实证Stata代码命令汇总 (一) 数据导入和管理 1. 数据导入 2. 数据导出

图文识别0难度上手~基于飞浆对pdf简易ocr并转txt

前言 本篇pdf适用windows对视觉识别0基础的的纯小白用户。大佬请绕道~~ 注意&#xff1a; 本项目pdf的ocr对于表格、画图文字&#xff0c;水印等干扰没做任何处理&#xff0c;因此希望各位使用该功能的pdf尽量不要含有这些干扰项&#xff0c;以免影响翻译效果。 流程 1.构建…

【c语言】轻松拿捏自定义类型

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 前言 一、结构体 1.结构体类型的定义和使用 1.1 结构体类型声明 1.2 结构体变量的创建和初始化 1.3 结构体变量成员的访问 1.4 结构体的特殊声…

MobPush iOS端 扩展业务功能设置

1、扩展业务说明 MobPush提供的扩展业务功能为&#xff1a; &#xff08;1&#xff09;按照地域提供更为精准的推送&#xff1b; &#xff08;2&#xff09;实现网络链路的选择与优化、检测并实现与特定区域相关的服务&#xff1b; &#xff08;3&#xff09;生成用户画像&…

三万字带你一遍跑通uer

三万字带你一遍跑通uer 参考文档 今天给大家介绍个非常强大的项目uer&#xff0c;集成了许多可以做自然语言的东西&#xff0c;效果的话也非常好&#xff0c;很适合企业级的应用&#xff01; 1. 先将项目uer从github拉取下来&#xff08;zip或git都ok&#xff09; 2. 用pycha…

HTTP代理服务器:深度解析与应用

“随着互联网的飞速发展&#xff0c;HTTP代理服务器在网络通信中扮演着越来越重要的角色。它们作为客户端和服务器之间的中介&#xff0c;不仅优化了网络性能&#xff0c;还提供了强大的安全性和隐私保护功能。” 一、HTTP代理服务器的概念与作用 HTTP代理服务器是一种能够接…

价值499的从Emlog主题模板PandaPRO移植到wordpress的主题

Panda PRO 主题&#xff0c;一款精致wordpress博客主题&#xff0c;令人惊叹的昼夜双版设计&#xff0c;精心打磨的一处处细节&#xff0c;一切从心出发&#xff0c;从零开始&#xff0c;只为让您的站点拥有速度与优雅兼具的极致体验。 从Emlog主题模板PandaPRO移植到wordpres…

兴业小课堂|什么是法拍房助拍机构?如何挑选靠谱的助拍机构?

随着法拍房市场的不断发展和扩大 使法拍房数量的增加 其交易的复杂性和专业性需求也日益凸显 这促使了专门机构的出现来满足市场需求 法拍房助拍机构存在的原因主要有以下几点&#xff1a; 1.专业知识和经验&#xff1a; 法拍房的交易流程相对复杂&#xff0c;涉及到法律法…

【全网最全ABC三题完整版】2024年APMCM第十四届亚太地区大学生数学建模竞赛(中文赛项)完整思路解析+代码+论文

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

全面探索C语言内存模型:从底层原理到高效实践

引言 在计算机科学领域&#xff0c;C语言以其贴近硬件的特性著称&#xff0c;程序员可以直接操作内存地址和管理内存空间。内存模型是理解程序运行机制的关键&#xff0c;它决定了变量存储的位置、生命周期以及数据访问效率。本文将深入剖析C语言中的内存布局、内存分配策略以…

第六节:如何解决@ComponentScan只能扫描当前包及子包(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;继上节咱们使用了Component和ComponentScan的方法实现了获取IOC容器中的Bean&#xff0c;但是存在一个问题&#xff0c;就是必须把AppConfig和要扫描的bean类放在同一个目录下&#xff0c;这样就导致了AppConfig类和bean类在同一个目…

FANG:利用社交网络图进行虚假新闻检测

1.概述 社交媒体已逐渐演变成为公众获取信息的主要途径。然而,值得警惕的是,并非所有流通的信息都具备真实性。特别是在政治选举、疫情爆发等关键节点,带有恶意企图的虚假信息(即“假新闻”)可能会对社会秩序、公平性和理性思考造成严重的干扰。作为全球抗击COVID-19的一部…

webpack 之 splitChunks分包策略

webpack 之 splitChunks分包策略 一、为什么需要拆包二、拆包方式三、splitChunks介绍四、splitChunks 拆包策略五、总结 一、为什么需要拆包 随着应用程序规模的增长&#xff0c;JavaScript 文件的大小也越来越大。一个大的 JavaScript 文件会导致页面加载时间过长&#xff0…

6.8应用进程跨网络通信

《计算机网络》第7版&#xff0c;谢希仁 理解socket通信