【数据结构--排序】堆排序

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 堆排序
    • 一、🌱排降序
      • 1.思路:
      • 2.代码实现:
      • 3.测试结果
      • 4.总代码
    • 二、🌸排升序
      • 1.思路:
      • 2.代码实现:
      • 3.测试结果:
      • 4.总代码
    • 三、堆排序的时间复杂度

堆排序

一、🌱排降序

口诀:排降序,建小堆

1.思路:

(1)首先使用从下到上的方法建立小堆;如下图

在这里插入图片描述

(2)堆顶与最后一个节点交换,由于是小堆,堆顶是最小值。交换后,就选出了最小值并将其放到数组的组后位置,
在这里插入图片描述

(3).将堆的长度减1【end–】(数组长度减1)。
(4).在对剩下的堆进行基于小堆的向下调整,从而将第二小的数调整到了堆顶。
在这里插入图片描述

重复步骤2.3.4,end一直减到0;
4.最后,这个原本存储小堆的数组,就变成了一个从小到大的降序数组。
在这里插入图片描述

2.代码实现:

1.交换

//交换
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}

2.修改AdjustDown(a, end, 0);为调小堆


基于小堆的向下调整
```c
//基于大堆的向下调整
void AdjustDownxiao(int* a, int n, int parent)
{int child = parent * 2 + 1;//一直交换到数的最后,也就是数组的最后一个位置while (child < n){if (child + 1 < n && a[child + 1] < a[child]){child++;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);// 继续往下调整parent = child;child = parent * 2 + 1;}else{return;}}
}

3.排降序

void HeapSortDES(int* a, int n)
{//建立小堆for (int i = (n-1-1)/2; i >= 0; i--){AdjustDownxiao(a, n, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);//每次调整从根0到end,end每次会减1。AdjustDownxiao(a, end, 0);--end;}
}

3.测试结果

在这里插入图片描述

4.总代码

//交换
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
//基于小堆的向下调整
void AdjustDownxiao(int* a, int n, int parent)
{int child = parent * 2 + 1;//一直交换到数的最后,也就是数组的最后一个位置while (child < n){if (child + 1 < n && a[child + 1] < a[child]){child++;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);// 继续往下调整parent = child;child = parent * 2 + 1;}else{return;}}
}//降序
void HeapSortDES(int* a, int n)
{//建立小堆for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDownxiao(a, n, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);//每次调整从根0到end,end每次会减1。AdjustDownxiao(a, end, 0);end--;}
}

二、🌸排升序

口诀:排升序,建大堆

意思是:想要将数组的顺序变成一个升序的,那么可以建立一个大堆存在数组中,在对堆进行调整。即可将数组变成一个升序数组。

1.思路:

首先使用从下到上的方法建立大堆;
1.堆顶与最后一个节点交换,由于是大堆,堆顶是最大值。交换后,就选出了最大值并将其放到数组的组后位置
2.并将堆的长度减1(数组长度减1)。
3.在对剩下的堆进行基于大堆的向下调整从而将第二大的数调整到了堆顶
4.最后,这个原本存储大堆的数组,就变成了一个从小到大的升序数组

2.代码实现:

1.交换

//交换
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}

2.基于大堆的向下调整

//基于大堆的向下调整
void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;//一直交换到数的最后,也就是数组的最后一个位置while (child < n){if (child + 1 < n && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);// 继续往下调整parent = child;child = parent * 2 + 1;}else{return;}}
}

3.排升序

//排升序
void HeapSortASC(int* a, int n)
{//建立大堆for (int i = (n-1-1)/2; i >= 0; i--){AdjustDown(a, n, i);}int end = n - 1;while (end > 0){swap(&a[0], &a[end]);//每次调整从根0到end,end每次会减1。AdjustDown(a, end, 0);end--;}
}

3.测试结果:

在这里插入图片描述

4.总代码

//交换
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;//一直交换到数的最后,也就是数组的最后一个位置while (child < n){if (child + 1 < n && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);// 继续往下调整parent = child;child = parent * 2 + 1;}else{return;}}
}//升序
void HeapSortASC(int* a, int n)
{//建立小堆for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);//每次调整从根0到end,end每次会减1。AdjustDown(a, end, 0);end--;}
}

三、堆排序的时间复杂度

堆排序分两步:1.建堆(使用时间复杂度更低的向下调整建堆)2.排序

向下调整建堆的时间复杂度为O(n);
n-1次删除操作的时间复杂度为O(nlogn);
所以总操作时间复杂度为O(nlogn)

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

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

相关文章

Python的多重继承和MixIn

前言&#xff1a; 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 多重继承 继承是面向对象编程的一个重要的方式&#xff0c;因为通过继承&#xff0c;子类就可以扩展父类的功能。 回忆一下Animal类层次的设…

使用SSH连接虚拟机一直提示填写密码

查看ssh服务是否开启 service ssh status 上面的报错&#xff0c;查看ssh、sshd是否都已安装&#xff1a;ps -e| grep ssh 这里显示没有安装sshd 安装sshd&#xff1a;sudo apt-get install openssh-server centos和ubantu的安装指令不一样&#xff0c;centos是使用yum指令进…

北大C++课后记录:文件读写的I/O流

前言 文件和平常用到的cin、cout流其实是一回事&#xff0c;可以将文件看作一个有限字符构成的顺序字符流&#xff0c;基于此&#xff0c;也可以像cin、cout读键盘数据那样对文件进行读写。 读写指针 输入流的read指针 输出流的write指针 注&#xff1a;这里的指针并不是普…

8年经验之谈 —— App测试常用的两种工具

一、监控工具 DDMS的全称是Dalvik Debug Monitor Service ,是Android开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、模拟接收及发送SMS、虚拟地理坐标等服务。 启动DDMS Eclipse中启…

操作系统权限提升(二十八)之数据库提权-SQL Server 数据库安装

SQL Server 数据库安装 SQL Server介绍 SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。…

Windows 基于Visual Studio 开发Qt 6 注意事项

前提条件&#xff1a; 1、Visual Studio 2022 社区版(免费版) 2、Qt-6.5.1版本 Qt Vistual Studio Tools下载 先打开Visual Studio 2022 社区版 &#xff1a; 点击扩展-》管理拓展按钮后&#xff0c;在搜索框中输入Qt&#xff0c;点击这里第一个扩展安装。 Qt Visual Stud…

ROS2 从头开始​​:第 1 部分 — 机器人操作系统简介

火星上的机器人&#xff08;AI生成图像&#xff09; 一、说明 ROS2是机器人的朋友&#xff0c;一个他们所依赖的平台&#xff0c;用于沟通、协调和控制&#xff0c;帮助他们实现目标。ROS2以DDS为核心&#xff0c;帮助机器人探索新世界、新任务、新可能性&#xff0c;是一个方…

单元测试的重要性

前言 在日常生活中&#xff0c;单元测试无论是对软件测试人员还是开发人员&#xff0c;都扮演着重要的角色。这主要是因为&#xff0c;单元测试在开发阶段&#xff0c;可以确保每个组件和程序都能够正常的运行。 很多开发人员都讨厌编写单元测试&#xff0c;但是它可以在开发…

李航老师《统计学习方法》第2章阅读笔记

感知机&#xff08;perceptron&#xff09;时二类分类的线性分类模型&#xff0c;其输入为实例的特征向量&#xff0c;输出为实例的类别&#xff0c;取1和-1二值。感知机对应于输入空间&#xff08;特征空间&#xff09;中将实例划分为正负两类的分离超平面 想象一下在一个平面…

并发编程系列-CAS

锁&#xff08;lock&#xff09;的代价 锁是用来做并发最简单的方式&#xff0c;其代价也是最高的&#xff0c;Java在JDK1.5之前都是靠synchronized关键字来加锁。但是加锁机制会有如下几个问题&#xff1a; 加锁、释放锁会需要操作系统进行上下文切换和调度延时&#xff0c;在…

【操作系统笔记十二】Linux常用基础命令

Linux 常用快捷键 Tab 命令或路径等的补全键&#xff0c;特别常用的快捷键Ctrl insert 复制命令行内容&#xff08;常用可提高效率&#xff09;Shift insert 粘贴命令行内容&#xff08;常用可提高效率&#xff09;Ctrl C 中断当前任务&#xff08;退出&#xff09;Ctrl Z…

备份服务器数据库并保存到Git仓库

备份项目及数据库脚本 #!/bin/bash # MySQL数据库信息 DB_HOST"localhost" DB_USER"root" DB_PASS"************" DB_NAME"my-space" # 导出文件目录 EXPORT_PATH"/home/MySpace/mysql" # 获取当前时间并格式…

ES6-解构赋值

可以将值从数组或属性从对象提取道不同的变量中。 交换变量 let a 1 let b 2 [ a, b ] [ b, a ]//a2,b1 数组 const arr [1,2,3,4]; let [a,b,c,d] arr;//a1,b2,c3,d4 let [foo] []; let [bar, foo] [1];//bar1,fooundefined 防止从数组中取出一个值为undefined的对…

逆向-beginners之结构体-成员地址访问

#include <stdio.h> #include <time.h> /* * 字节型数组 */ int main() { struct tm t; time_t unix_time; int i0, j0; unix_time time(NULL); localtime_r(&unix_time, &t); for (i 0; i < 9; i) { for (j 0; j < 4; j…

海外代理IP是什么?如何使用?

一、海外代理IP是什么&#xff1f; 首先&#xff0c;代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器&#xff0c;被称为“中介”&#xff0c;因为它位于最终用户和他们在线访问的网页之间。 海外IP代理是就是指从海外地区获取的IP地址&#xff0c;用…

Zookeeper高级_四字命令

之前使用stat命令来验证ZooKeeper服务器是否启动成功&#xff0c;这里的stat命令就是ZooKeeper 中最为典型的命令之一。ZooKeeper中有很多类似的命令&#xff0c;它们的长度通常都是4个英文字母&#xff0c;因此我们称之为“四字命令”。 添加配置 vim zoo.cfg 4lw.commands…

C++之类和函数权限访问总结(二百二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

window便捷使用技巧(LTS)

目前很乱&#xff0c;有空整理 %AppData%\Microsoft\Windows\Recent\AutomaticDestinations Windows应用程序设置快捷键 AutoHotkey组合键设置 热键重复调用 powertoy工具连接 Windows常用shell命令 2 台电脑共享键鼠最简单教程 QTTabBar 「资源管理器」该有的样子 win10电脑…

为什么网络安全缺口很大,而招聘却很少?学网络安全真的没有前途吗?

2020年我国网络空间安全人才数量缺口超过了140万&#xff0c;就业人数却只有10多万&#xff0c;缺口高达了93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&#xff1…

设计模式再探——宏观篇

目录 一、背景介绍二、思路&方案三、过程1.宏观介绍2.目的与意义3.七大原则的定义与边界4.思路由来 四、总结五、升华 一、背景介绍 最近在做产品技术建模的过程中&#xff0c;一些地方刻意用到了设计模式&#xff0c;而一些地方也用到了但是并不是很明确。 于是乎就带着…