【数据结构】排序详解(希尔排序,快速排序,堆排序,插入排序,选择排序,冒泡排序)

目录

0. 前情提醒:

1. 插入排序

1.1 基本思想:

1.2 直接插入排序

 实现步骤:

 动图演示:

 特性总结:

 代码实现:

1.3 希尔排序(缩小增量排序)

基本思想:

步骤演示:

特性总结:

代码实现:

2. 交换排序

2.1 基本思想:

2.2 冒泡排序

特性总结:

代码实现:

2.3 快速排序

3.选择排序

3.1 基本思想:

3.2 直接选择排序

步骤思路:

动图演示: 

特性总结:

代码实现:

3.3 堆排序

代码实现:


0. 前情提醒:

下面的所有代码实现均为升序

1. 插入排序

1.1 基本思想:

把待排序的记录按其关键码值的大小逐个插入到一个已经排序好的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

1.2 直接插入排序
 实现步骤:

当插入第i(i>=1)各元素时,前面的array[0],array[1],......,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],......的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

 动图演示:

 特性总结:
  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 4.稳定性:稳定
 代码实现:
void InsertSort(int* a, int n) {for (int i = 0; i < n; i++) {int m = a[i];int end = i;while (end > 0 && a[end - 1] > m) {a[end] = a[end - 1];end--;}a[end] = m;}
}
1.3 希尔排序(缩小增量排序)
基本思想:

先选定一个整数,把待排序的文件中所有(n个)记录分成(n/gap)个组,所有距离为gap的记录分在同一个组,并对每个组内的记录进行排序。然后去gap=gap/2,重复上述分组和排序的工作。当到达gap=1时,所有记录在统一组内排好序(gap=1时就是直接插入排序,gap>1时属于预排序)。

步骤演示:

特性总结:
  1. 希尔排序是对直接插入排序的优化
  2. 当gap>1时都是预排序,目的是让数组更接近有序。当gap==1时,数组已经接近有序,这样排序就会很快。这样整体而言,可以达到优化的效果
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在不同书上给出的希尔排序的时间复杂度都不一样
代码实现:
void ShellSort(int* a, int n) {int gap = n;while (gap > 1) {gap = gap / 3 + 1;for (int i = 0; i < n; i++) {int m = a[i];int end = i;while (end > 0 && a[end - gap] > m) {a[end] = a[end - gap];end -= gap;}a[end] = m;}}
}

2. 交换排序

2.1 基本思想:

所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向前部移动

2.2 冒泡排序

左边大于右边交换,一趟排下来最大的在右边

特性总结:
  1. 冒泡排序是一种非常容易理解的排序
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定
代码实现:
void BubbleSort(int* a, int n) {for (int i = 0; i < n; i++) {int k = 1;for (int j = 0; j < n-i-1; j++) {if (a[j] > a[j + 1]) {k = 0;int x = a[j];a[j] = a[j + 1];a[j + 1] = x;}}if (k) {break;}}
}
2.3 快速排序

快速排序较为复杂,想了解请点击-----》快速排序

3.选择排序

3.1 基本思想:

每一次从待排序的数据元素中选出一个最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

3.2 直接选择排序
步骤思路:
  • 在元素array[i]--array[n-1]中选择关键码最小(或最大)的数据元素
  • 若它不是这组元素中最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
  • 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素
动图演示: 

特性总结:
  1. 思路很好理解,但效率不好,实际很少应用,主要具有教学意义
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定
代码实现:
void SelectSort(int* a, int n) {for (int i = 0; i < n; i++) {int min = n - 1;for (int j = i; j < n; j++) {if (a[min] > a[j]) {min = j;}}swap(&a[min], &a[i]);}
}
3.3 堆排序

堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据,利用堆中某个节点的值总是不大于或不小于其父节点的值的特性。注意:升序建大堆,降序建小堆

代码实现:
void AdjustDwon(int* a, int n, int root) {int i = 2 * root + 1;if (i < n - 1 && a[i] < a[i + 1]) {i++;}if (i < n && a[root] < a[i]) {swap(&a[root], &a[i]);AdjustDwon(a, n, i);}
}
void HeapSort(int* a, int n) {
//建堆for (int i = (n - 1 - 1) / 2; i >= 0; i--) {AdjustDwon(a, n, i);}while (n>1) {swap(&a[0], &a[n-1]);n--;AdjustDwon(a, n, 0);}
}

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

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

相关文章

AI大模型如何赋能智能座舱

AI 大模型如何赋能智能座舱 从上海车展上&#xff0c;我们看到由于智能座舱配置性价比较高&#xff0c;已经成为车企的核心竞争点之一&#xff0c;随着座舱硬件规模化装车&#xff0c;蔚小理、岚图、极狐等新势力开始注重座舱多模态交互&#xff0c;通过集成语音/手势/触控打造…

Leetcode—2769. 找出最大的可达成数字【简单】

2024每日刷题&#xff08;139&#xff09; Leetcode—2769. 找出最大的可达成数字 实现代码 class Solution { public:int theMaximumAchievableX(int num, int t) {return num t * 2;} };运行结果 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连…

【实战】SpringBoot整合Websocket、Redis实现Websocket集群负载均衡

文章目录 前言技术积累什么是Websocket什么是Redis发布订阅Redis发布订阅与消息队列的区别 实战演示SpringBoot整合WebsoketWebsoket集群负载均衡 实战测试IDEA启动两台服务端配置nginx负载均衡浏览器访问模拟对话 前言 相信很多同学都用过websocket来实现服务端主动向客户端推…

【知识蒸馏】deeplabv3 logit-based 知识蒸馏实战,对剪枝的模型进行蒸馏训练

本文将对【模型剪枝】基于DepGraph(依赖图)完成复杂模型的一键剪枝 文章中剪枝的模型进行蒸馏训练 一、逻辑蒸馏步骤 加载教师模型定义蒸馏loss计算蒸馏loss正常训练 二、代码 1、加载教师模型 教师模型使用未进行剪枝&#xff0c;并且已经训练好的原始模型。 teacher_mod…

利用Python去除PDF水印

摘要 本文介绍了如何使用 Python 中的 PyMuPDF 和 OpenCV 库来从 PDF 文件中移除水印&#xff0c;并将每个页面保存为图像文件的方法。我们将深入探讨代码背后的工作原理&#xff0c;并提供一个简单的使用示例。 导言 简介&#xff1a;水印在许多 PDF 文件中都很常见&#x…

全国数据库管理系统设计赛-人大金仓内核实训安排正式发布

作为数据库领域国家队&#xff0c;人大金仓积极响应国家战略&#xff0c;通过赛题设计、内核技术支撑及赛前培训等多方面&#xff0c;大力支持全国大学生计算机系统能力大赛-数据库管理系统设计大赛成功举办。目前第二届全国大赛正在火热报名中&#xff0c;各种奖项等你来拿&am…

《web应用设计》第八次作业

我的小组长是姚若希&#xff0c;我们组课程设计的题目是&#xff1a;学生管理系统 &#xff0c;我认领的功能模块是&#xff1a;课程管理 2.查询并分页

只需三步,即可配置HTTPS跳转

HTTPS&#xff08;全称&#xff1a;Hyper Text Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。通过SSL/TLS协议对数据进行加密&#xff0c;保证了数据传输的安全&#xff0c;防止数据被截获、…

UWB论文:Introduction to Impulse Radio UWB Seamless Access Systems(2):脉冲;超宽带;测距;定位

3) 测距/接收器 像全球定位系统&#xff08;GPS&#xff09;这样的系统依赖于单向测距One Way Ranging&#xff08;OWR&#xff09;&#xff0c;其中多个卫星&#xff08;代表固定节点&#xff0c;称为锚点anchors&#xff09;定期传输同步的无线电数据包集合&#xff0c;这允许…

sh控制台输入文字多行 按“# ꧂ ꧁”结束

如果在Unix shell中输入多行文字&#xff0c;那么这样操作&#xff1a; 1. 打开您的终端&#xff08;Terminal&#xff09;。 2. 输入您的文字&#xff0c;每行文字后按回车键。 3. 当您完成输入所有文字后&#xff0c;输入“# ꧂ ꧁”然后按回车键&#xff0c;表示输入结束。…

将Surface的分辨率减半以省电(二合一本\笔记本电脑适用)

【完全自定义分辨率教程】这篇教程用于将Surface之类的高分屏&#xff08;高分辨率&#xff09;的二合一本或笔记本等的分辨率调整为原来的一半&#xff0c;以实现省电等目的。 下载CRU&#xff08;Custom Resolution Utility&#xff09;解压后&#xff0c;打开CRU.exe选择当…

Java期末复习指南(1):知识点总结+思维导图,考试速成!

&#x1f516;面向对象 &#x1f4d6; Java作为面向对象的编程语言&#xff0c;我们首先必须要了解类和对象的概念&#xff0c;本章的所有内容和知识都是围绕类和对象展开的&#xff01; ▐ 思维导图1 ▐ 类和对象的概念 • 简单来说&#xff0c;类就是对具有相同特征的一类事…

(全面)Nginx格式化插件,Nginx生产工具,Nginx常用命令

目录 &#x1f3ab; 前言 &#x1f389; 开篇福利 &#x1f381; 开篇福利 x2 Double happiness # 介绍 # 地址 # 下载 &#x1f4bb; 命令及解析 # 整个文件系统中搜索名为nginx.conf的文件 # 编辑nginx.conf文件 # 重新加载配置文件 # 快速查找nginx.conf文件并使…

建筑施工突发事故应急处置vr安全培训平台

在不断发展的时代背景下&#xff0c;掌握必要的应急安全知识已成为我们生活中不可或缺的一部分。由央企携手我们华锐推出的3D线上应急宣教虚拟体验馆&#xff0c;标志着民众应急安全教育的全新里程碑&#xff0c;不仅突破了传统学习模式的局限&#xff0c;还让每个人都能在灵活…

防火墙技术基础篇:基于IP地址的转发策略

防火墙技术基础篇&#xff1a;基于IP地址的转发策略的应用场景及实现 什么是基于IP地址的转发策略&#xff1f; 基于IP地址的转发策略是一种网络管理方法&#xff0c;它允许根据目标IP地址来选择数据包的转发路径。这种策略比传统的基于目的地地址的路由更灵活&#xff0c;因…

深度学习之Python+OpenCV+Tensorflow实时人体检测和计数

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习之PythonOpenCVTensorflow实时人体检测和计数项目简介 一、项目背景与意义 随着科技的不断发展&#xff…

Go微服务: 日志系统ELK的应用

概述 基于前文&#xff0c;我们已经了解并搭建完成ELK的所有环境了&#xff0c;现在我们来结合应用程序来使用ELK参考前文&#xff1a;https://active.blog.csdn.net/article/details/138898538 封装日志模块 在通用工具模块: gitee.com/go-micro-services/common 这个包是通…

CTFHUB技能树——SSRF(三)

目录 URL Bypass 数字IP Bypass 302跳转 Bypass DNS重绑定 Bypass SSRF绕过方法&#xff1a; &#xff08;1&#xff09; http://abc.com127.0.0.1 &#xff08;2&#xff09;添加端口号 http://127.0.0.1:8080 &#xff08;3&#xff09;短地址 htt…

限制U盘使用:企业数据安全的软件解决方案

在当今数字化办公环境中&#xff0c;U盘作为一种便捷的数据传输工具&#xff0c;其使用在企业内部非常普遍。然而&#xff0c;U盘的不当使用也给企业数据安全带来了巨大风险。为了防止数据泄露和病毒传播&#xff0c;企业需要采取有效的软件解决方案来限制U盘的使用。本文将探讨…