快速学习“堆“排序(C语言数据结构)

前言:

        堆的实现其实并不难,难的是要用堆实现排序,也就是堆的运用

        下面需要探究一下堆的排序是怎样的。

        如何利用堆进行升序或者降序的排序。

"堆排序":

   原理:

        例如:此时要将数组里的数组int arr[] = {12,20,26,8,1,2,3}进行升序或者降序排序

第一步:把数放进堆里面,但是究竟是放在大堆还是小堆里面呢?

如果需要升序就需要放进大堆里面!

如果需要降序就需要放进小堆里面!

(原因后续画图讲解)

如何将一个数组直接放在大堆当中呢?

可以直接遍历数组,将数一个一个放入。

代码如下:

typedef int HPDataType;
void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
void HeapPush(Heap* hp, HPDataType x)
{assert(hp);if (hp->_capacity == hp->_size){int newcapacity = hp->_capacity == 0 ? 4 : hp->_capacity * 2;HPDataType* tmp = (HPDataType*)realloc(hp->_a, newcapacity * sizeof(HPDataType));if (tmp == NULL){perror("malloc::error");exit(-1);}hp->_capacity = newcapacity;hp->_a = tmp;}hp->_a[hp->_size] = x;hp->_size++;AdjustUp(hp->_a, hp->_size - 1);
}
void test2()
{Heap hp;HeapInit(&hp);int arr[] = {12,20,26,8,1,2,3};int i = 0;int size = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < size; i++){HeapPush(&hp, arr[i]);}}

此时就直接形成了”大堆“。

第二步:每次需要交换首和尾

              交换之后将除了新的尾的数之外的数进行向下调整

              也就是将除了26以外的数进行向下调整:

向下调整:

第三步:以此类推,直到遍历到第一个数为止。

大家可以亲自动手画一画,很有助于理解。

我把这个方法称之为“沉淀法”!

此时最后就是一个升序的树,可以直接按照顺序打印出来。

代码如下:

void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
void HeapPush(Heap* hp, HPDataType x)
{assert(hp);if (hp->_capacity == hp->_size){int newcapacity = hp->_capacity == 0 ? 4 : hp->_capacity * 2;HPDataType* tmp = (HPDataType*)realloc(hp->_a, newcapacity * sizeof(HPDataType));if (tmp == NULL){perror("malloc::error");exit(-1);}hp->_capacity = newcapacity;hp->_a = tmp;}hp->_a[hp->_size] = x;hp->_size++;AdjustUp(hp->_a, hp->_size - 1);
}
void HeapInit(Heap* hp)
{assert(hp);hp->_a = NULL;hp->_capacity = hp->_size = 0;
}
void AdjustDown(HPDataType* a, int size, int parent)
{//假设最大的孩子的值是左孩子对应的数值int childmax = (parent * 2) + 1;while (childmax < size){//如果右有孩子并且右孩子的值是大于左孩子将最大的孩子换成右孩子if (childmax + 1 < size && a[childmax + 1] > a[childmax]){childmax = childmax + 1;}if (a[parent] < a[childmax]){swap(&a[parent], &a[childmax]);parent = childmax;childmax = (parent * 2) + 1;}else{break;}}
}
void test2()
{Heap hp;HeapInit(&hp);int arr[] = {12,20,26,8,1,2,3};int i = 0;int size = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < size; i++){HeapPush(&hp, arr[i]);}for (i = 0; i < size; i++){//交换首尾swap(&hp._a[0], &hp._a[hp._size - 1 - i]);//向下调整AdjustDown(hp._a, hp._size-1-i, 0);}for (i = 0; i < size; i++){arr[i] = hp._a[i];}for (i = 0; i < size; i++){printf("%d ", arr[i]);}
}
int main()
{//test1();test2();return 0;
}

"十万个数据"进行堆排序:

        大数据时代,如果有10万个数据要进行排序,该怎么排序。

        究竟是用哪种排序的方式时间复杂度最低呢?

     在这之前需要我们计算一下”堆排序“的时间复杂度!

建堆的时间复杂度:


堆排序的时间复杂度:

        

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

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

相关文章

Leetcode面试经典150题-5.最长回文子串

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public static String longestPalindrome(String s) {if(s null || s.length() 0) {return null;}//加工字符串&#xff0c;例如abcdcba加工成#a#b#c#d#a#b#c#d#String str getManacherString(s);char[] str…

【生日视频制作】滑行飞机机身改字,轻松修改文字AE模板修改文字软件生成器教程特效素材【AE模板】

飞机机身生日视频制作教程AE模板改文字特效广告生成器素材玩法 怎么如何做的【生日视频制作】滑行飞机机身改字&#xff0c;轻松修改文字AE模板修改文字软件生成器教程特效素材玩法【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或…

基于Java+SpringBoot+Vue的知识管理系统

基于JavaSpringBootVue的知识管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 哈喽…

利用“2+1链动模式小程序AI智能名片S2B2C商城源码”优化企业参与外部社群策略

摘要&#xff1a;在当今数字化时代&#xff0c;企业参与外部社群已成为其市场扩张、品牌塑造及用户增长不可或缺的一环。然而&#xff0c;面对浩如烟海的社群类型&#xff0c;包括行业论坛、地区性论坛、特定兴趣爱好的论坛以及短视频网站等&#xff0c;如何精准选择并有效介入…

计算机网络-PIM-SM组播实验

一、概述 目前为止我们学习了组播转发网络中的PIM协议&#xff0c;PIM模型有两种&#xff1a; PIM-DM主要使用在网络规模较小&#xff0c;用户集中的组播网络中。 PIM-SM主要使用在网络规模较大&#xff0c;用户较为分散的组播网络中。PIM-SM基于组播模型又可以分为PIM-SM&…

重装系统前如何备份数据?让重装无后顾之忧

在日常使用电脑的过程中&#xff0c;有时我们可能需要重装系统以解决一些难以通过常规手段解决的问题。然而&#xff0c;在重装系统之前&#xff0c;最重要的一步就是备份数据&#xff0c;以防止重要信息的丢失。本文将详细介绍如何在重装系统前进行数据备份&#xff0c;确保您…

周报(8.12-8.18)

周报(8.12-8.18) 本周工作 DD-Net学习与代码复现 DD-Net网络结构如上图所示。DD-Net也有一个为处理OpenFWI数据的版本&#xff1a;DD-Net70&#xff1a; 与传统DL-FWI不同的是&#xff0c;DD-Net同时拥有两个解码器&#xff0c;第一个解码器的目标是传统的速度模型&#xff0…

力扣第71题:简化路径 放弃栈模拟,选择数据流√(C++)

目录 题目 思路 解题过程 复杂度 Code 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff…

医生隐瞒病情属于什么行为?

根据《民法典》第一千二百二十二条的规定&#xff0c;患者在诊疗活动中受到损害&#xff0c;有下列情形之一的&#xff0c;推定医疗机构有过错&#xff1a;   &#xff08;一&#xff09;违反法律、行政法规、规章以及其他有关诊疗规范的规定&#xff1b;   &#xff08;二…

LLMs 基础知识 | BERT 模型族

本文主要文章是解决蚂蚁金服携手上海财经大学&#xff0c;共同出具大预言模型白皮书一文中的部分模型问题。 01 Slef-Attention 注意力机制&#xff0c;注意力权重可以看作是输入对输出的重要程度。这里注意&#xff0c;所谓注意力&#xff0c;即模型认为该单词有多值得被注意…

基于BlockQueue的生产消费模型及Linux中的信号量

基于BlockQueue的生产消费模型 Task.hpp #pragma once#include<cstdio> #include<iostream> #include<string> #include<functional>using namespace std; class CalTask {using func_tfunction<int(int,int,char)>;//typedef function<int(…

妙用 Batch,StarRocks 存算分离实时性能起飞

前言 当大家提到存算分离时&#xff0c;尤其是考虑后端使用 AWS S3 为代表的对象存储作为数据存储时&#xff0c;直觉就是性能拉胯&#xff0c;只能用作批量数据处理场景&#xff0c;至少这是我在跟很多用户交流时获得的第一感受。而 StarRocks 作为一个具备强实时性数据分析引…

Vue实现zip压缩下载

1&#xff0c;安装依赖npm //jszip是一个用于创建、读取和编辑.zip文件的JavaScript库 https://stuk.github.io/jszip/ npm install jszip https://www.npmjs.com/package/file-saver npm install file-saver 2&#xff0c;在所需的页面中引入对应包 import JSZip from &…

【启明智显分享】智能音箱AI大模型一站式解决方案重塑人机交互体验,2个月高效落地

2010年左右&#xff0c;智能系统接入音箱市场&#xff0c;智能音箱行业在中国市场兴起。但大潮激荡&#xff0c;阿里、小米、百度三大巨头凭借自身强大的资本、技术、粉丝群强势入局&#xff0c;形成三足鼎立态势。经过几年快速普及&#xff0c;智能音箱整体渗透率极高&#xf…

【课件分享】电子档案库房——构筑档案数字资源长期保存的安全防线

关注我们 - 数字罗塞塔计划 - 如此重磅的会议&#xff0c;如此高能的干货&#xff0c;小编已经迫不及待第一时间分享给大家&#xff0c;一起来看看杨博士在学术交流活动上的演讲内容吧。 01 课件分享 一、背景现状 二、总体设计 详细视频请在公众号中观看 三、解决方案 四、应…

汽车线束品牌服务商推荐-力可欣:致力于汽车连接线束和汽车连接器的开发、生产和应用

汽车线束品牌服务商推荐-力可欣&#xff1a;致力于汽车连接线束和汽车连接器的开发、生产和应用

安卓13 背光调节非线性问题处理,调节范围不正常问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码修改 4.彩蛋 1.前言 我们看看现在的版本的亮度图 2.问题分析 当背光亮度设置为0%时,每次按下亮度增加键或者 input keyevent BRIGHTNESS_UP,亮度UI的增幅较大,首次按下后亮度平滑提升至大约55%,随后继…

深入调研亚马逊云科技AI平台Amazon Bedrock热门开发功能

国际数据公司&#xff08;IDC&#xff09;在2024 年 8 月发布了《 中国大模型平台市场份额&#xff0c; 2023 &#xff1a;大模型元年——初局 》调研报告 。IDC的数据显示&#xff0c;2023年中国大模型平台及相关应用市场规模达惊人的17.65亿元人民币&#xff0c;且科学计算大…

售后更新出现问题分析-幂等和防重

2024-08-27 早上测试提交BUG,说售后单状态流转不对&#xff0c;吓得我一激灵&#xff0c;赶紧打开IDEA 查看代码&#xff0c;发现售后这块代码没有动过呀&#xff0c;咋回事&#xff1f; 流程是这样的&#xff1a; 测试模拟用户下单&#xff0c;提交订单后付款&#xff0c;然后…

基于顺序表实现通讯录功能项目

本文通过顺序表实现通讯录的功能&#xff0c;增删查改数据 首先实现顺序表的功能&#xff0c;再用顺序表实现通讯录的功能 顺序表中的成员为一个结构体对象con&#xff0c;自定义的类型&#xff0c;里面包含着联系人的姓名性别年龄电话地址 seqlist.h&#xff1a;顺序表头文…