【数据结构】排序算法

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

🎏排序的定义

🎏排序的稳定性

📌稳定性的定义

📌稳定性的意义

🎏内排序与外排序

🎏八大内排序

📌冒泡排序

📌希尔排序

📌直接插入排序

📌简单选择排序

📌堆排序

📌快速排序

📌归并排序

📌计数排序

🎏结语


🎏排序的定义

排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列.

排序的定义:

假设含n个记录的序列为\left \{ R_1,R_2,...,R_n \right.\left. \right \}其相应的关键字序列为\left \{ \left. K_1,K_2,...,K_n \right \} \right.需确定1,2,...,n的一种排列p_1,p_2,...,p_n,使其相应的关键字满足如下的非递减(或非递增)关系.

K_{p1}\leqslant K_{p2}\leqslant ...\leq K_{pn},即使\left \{ R_1,R_2,...,R_n \right.\left. \right \}成为一个按关键字有序的序列\left \{ R_{p1},R_{p2},...,R_{pn}\right.\left. \right \},这样一种操作称为排序.


🎏排序的稳定性

📌稳定性的定义

假设关键字序列为:\left \{ \left. K_1,K_2,...,K_n \right \} \right.,其中K_i=K_j(1\leqslant i\leqslant n,1\leqslant j\leqslant n,i\neq j),且在排序前的序列中K_i领先于K_j(即i<j).如果排序后K_i仍领先于K_j,则称所用的排序方法是稳定的;反之,若可能使得排序后的序列中K_j领先K_i,则称所用的排序方法是不稳定的.

📌稳定性的意义

排序稳定性主要是方便我们对一个复杂结构体进行副关键字辅助主关键字进行排序.

如下,是一份模拟考试的成绩单,可以看到,单按总分排名的话,就会出现有两人总分一致,然后并列排名的情况,于是我们为了在排名上区分出二者,就设定了一项规则:如果两人总分数一致,则比较两人语文成绩,语文成绩高则排名在前.像这种有主次性排序条件的多条件排序,我们通常需要借助稳定的排序算法先将数据按照副排序条件进行一次排序,再在此基础上按照主排序条件进行一次排序,这样得到的结果,就能够满足:主排序条件一致的情况下,同样满足副排序条件的数据在前的序列了.

  • 常见的稳定的排序算法有: 直接插入排序,冒泡排序,简单选择排序,归并排序,基数排序
  • 常见的不稳定的排序算法有:希尔排序,快速排序,堆排序,计数排序

🎏内排序与外排序

根据在排序过程中待排序的记录是否全部被放置在内存中,排序分为:内排序和外排序.

内排序是在排序的整个过程中,待排序的所有记录全部被放置在内存中.外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行.


🎏八大内排序

📌冒泡排序

它的基本思想是:

  • 重复走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
  • 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

算法演示动图如下:

算法单趟排序可视化过程:

有关冒泡排序的具体代码实现:

【数据结构】八大排序之冒泡排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/129173919?spm=1001.2014.3001.5502


📌希尔排序

它的基本思想是:

  • 先选定一个整数,把待排序文件中所有数据分成gap个组,所有距离为gap的数据分在同一组内,并对每一组内的数据进行排序.
  • 重复上述分组和排序的工作,当达到gap=1时,所有数据在统一组内排好序.

算法动图演示如下:

算法单趟排序可视化过程(以gap/=2为例):

有关希尔排序的具体代码实现:

【数据结构】八大排序之希尔排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135043566


📌直接插入排序

它的基本操作是:

  • 将一个数据插入到已经排好的有序表中,从而得到一个新的,数据数增1的有序表.
  • 直到所有的数据插入完为止,得到一个新的有序序列.

算法动图演示如下:

算法单趟排序可视化过程:

有关直接插入排序的具体代码实现:

【数据结构】八大排序之直接插入排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135038521?spm=1001.2014.3001.5502


📌简单选择排序

它的基本操作是:

  • 每一次通过n-i次关键字间的比较,从n-i+1个数据中选出关键字最小(大)的数据,并和第i(1≤i≤n)个数据交换
  • 重复n-1次上述操作,直到全部待排序的数据元素排完.

算法动图演示如下:

算法单趟排序可视化过程:

有关简单选择排序的具体代码实现:

【数据结构】八大排序之简单选择排序icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135059302?spm=1001.2014.3001.5502


📌堆排序

它的基本思想是:

  1. 将待排序的序列构造成一个大堆.(如果是降序则建小堆)
  2. 此时,整个序列的最大值就是堆顶的根结点.将它移走(其实就是我们前面堆实现中的出堆顶操作).
  3. 然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值(即堆顶).
  4. 如此反复执行,就可以得到一个有序的序列了.

算法动图演示:

1.向下调整建堆

逻辑结构:

物理结构:

2.堆排序(升序)

逻辑结构:

物理结构:

算法单趟排序可视化过程:

有关堆排序的具体代码实现:

【数据结构】八大排序之堆排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135059322?spm=1001.2014.3001.5502


📌快速排序

它的基本思想是:

  • 通过一趟排序将待排数据分割成独立的两部分
  • 其中一部分数据的关键字均比另一部分数据的关键字小
  • 可分别对这两部分数据继续进行排序,以达到整个序列有序的目的.

算法动图演示:

算法单趟排序可视化过程:

有关快速排序的具体代码实现:

【数据结构】八大排序之快速排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135059337?spm=1001.2014.3001.5502


📌归并排序

归并排序(Merging Sort)就是利用归并的思想实现的排序方法.

它的原理是:

       假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到\left \lceil \frac{n}{2} \right \rceil(\left \lceil x \right \rceil表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,......,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序.

算法动图演示如下:

算法逻辑演示:

算法单趟排序可视化过程:

有关归并排序的具体代码实现:

【数据结构】八大排序算法之归并排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135059352


📌计数排序

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

计数排序的实现思路:

  1. 统计每个数据出现的次数
  2. 按序输出

算法动图演示如下:

算法单趟排序可视化过程:

有关直接插入排序的具体代码实现:

【数据结构】八大排序之计数排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135059360


🎏结语

 希望这篇八大排序算法简介能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】C语言实现链队列(附完整运行代码)

【数据结构】用C语言实现顺序栈(附完整运行代码)

【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)

【数据结构】C语言实现单链表万字详解(附完整运行代码)

【数据结构】C语言实现顺序表万字详解(附完整运行代码)

数据结构排序算法篇思维导图:

 

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

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

相关文章

GitHub图床搭建

1 准备Github账号 如果没有Github账号需要先在官网注册一个账号 2 创建仓库 在github上创建一个仓库&#xff0c;随便一个普通的仓库就行&#xff0c;选择公共仓库 3 github token获取 github token创建方式可以参考下面的方式&#xff1a; https://www.xichangyou.com/6…

c/c++中static的用法

概述 static&#xff1a; 作为c/c的关键字之一&#xff0c;具有多种含义和应用&#xff0c;static 关键字可用于声明变量、函数、类数据成员和类函数。默认情况下&#xff0c;在所有块的外部定义的对象或变量具有静态持续时间和外部链接。 静态持续时间意味着&#xff0c;在程…

MT1138-MT1150总结

1. 判断闰年方法 year%40&&year%400&#xff01;0||year%4000 #include<bits/stdc.h> using namespace std;int day(int year,int mouth){if(mouth1||mouth3||mouth5||mouth7||mouth8||mouth10||mouth12){return 31;}else if(mouth4||mouth6||mouth9||mouth11)…

Golang 三数之和 leetcode15 双指针法

三数之和 leetcode15 知识补充&#xff1a; map的key值必须是可以比较运算的类型&#xff0c;不可以是函数、map、slice map记录 失败&#xff01;超出限制 //得到结果后再去重 失败&#xff01; func threeSum(nums []int) [][]int {L : len(nums)var intT stringresult : […

python使用贪心算法求最大整数问题

对于使用贪心算法的一个比较经典的问题&#xff0c;主要是为了解决最大整数的拼接问题&#xff0c;如果给定一个列表&#xff0c;这个列表中所包括的是一些非负整数&#xff0c;如果对这些整数进行组合&#xff0c;怎样才能组合出一个最大的整数&#xff0c;这里要注意一个问题…

1.2MATLAB数据类型和常用函数

MATLAB数据类型 数据类型表示范围整型 无符号整数8位无符号整数00000000~11111111 &#xff08;0~-1&#xff09;16位无符号整数32位无符号整数64位无符号整数带符号整数8位带符号整数10000000~01111111 (~)最左边的1表示符号负号16位带符号整数32位带符号整数64位带符号整数浮…

解决No module named ’torch._six‘问题

如果是 deepspeed &#xff0c;解决方法&#xff1a; deepspeed 安装 Windows deepspeed 安装 Windows-CSDN博客

【C++】内联函数

前言 在C语言中&#xff0c;我们学习过宏的用法。宏通常被用于进行简单的文本替换来执行一系列的操作&#xff0c;比如一些简单的运算。使用宏可以避免函数调用时建立栈帧的开销&#xff0c;提高程序的性能。我们首先来写一个实现加法功能的宏&#xff1a; #define ADD(x, y)…

【我的RUST库】get_local_info 0.2.2发布

0.2.2增加在cargo上的github链接&#xff0c;地址&#xff1a; get_local_info - crates.io: Rust Package Registry

物理学如何推动生成式 AI 的发展

一、说明 许多尖端的生成式 AI 模型都受到物理学概念的启发。在本指南中&#xff0c;我们将从高层次上了解物理学如何推动人工智能的进步。不同的领域经常交叉授粉重要概念&#xff0c;这有助于推动其进步。数学概念为物理学的进步奠定了基础;物理学中的概念经常启发经济学的框…

紫外加速老化试热冲击试验箱

紫外加速老化试热冲击试验箱是用于测试产品在高低温环境下的适应性以及性能表现的实验设备。其功能特点主要包括以下几个方面&#xff1a; 1. 温度控制&#xff1a;冷热冲击试验箱能够提供高温、低温以及常温的测试环境&#xff0c;并且可以快速地实现温度的转换和控制。这使得…

高效办公:如何通过在文件名称右边添加关键字提升工作效率

在繁忙的办公环境中&#xff0c;经常要处理大量的文件和资料。那如何管理和查找这些文件呢&#xff0c;常见的方法有在文件名称右边添加关键字。下面来看云炫文件管理器如何通过在文件名称右边添加关键字来提升工作效率。 在文件名称右边添加关键字前后效果图。 文件名批量添加…

老卫带你学---leetcode刷题(38. 外观数列)

38. 外观数列 问题 给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1) “1” c…

P5461 赦免战俘题解

题目 现有2n2n(n≤10) 名作弊者站成一个正方形方阵等候kkksc03的发落。kkksc03决定赦免一些作弊者。他将正方形矩阵均分为4个更小的正方形矩阵&#xff0c;每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免&#xff0c;剩下3个小矩阵中&…

AC修炼计划(AtCoder Beginner Contest 334)A~G

传送门&#xff1a;UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) - AtCoder A题是最最基础的语法题就不再讲解。 B - Christmas Trees 该题虽然分低&#xff0c;但我觉得还是很不错的。 给你 l 和 r &#xff0c;设满足题意的数字是x则…

检查是否是类的对象实例

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 请你编写一个函数&#xff0c;检查给定的值是否是给定类或超类的实例。 可以传递给函数的数…

Linux学习之网络编程3(高并发服务器)

写在前面 Linux网络编程我是看视频学的&#xff0c;Linux网络编程&#xff0c;看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 高并发服务器 问题&#xff1a; 根据上一个笔记&#xff0c;我们可以写出一个简单的服务端…

52. N 皇后 II

这道题我认为关键是建立好行列之间的数组col&#xff0c;表示第i行第col[i]列 i从0到n-1开始遍历&#xff08;已经保证了不同行&#xff09;&#xff0c;在每次遍历中判断每一列&#xff08;相当于判断这一行中&#xff0c;皇后应该放在哪一列&#xff09; 判断函数valid的规…

七、HorizontalPodAutoscaler(HPA)

目录 一、HPA概述&#xff1a; 二、HPA工作机制&#xff1a; 三、HPA流程: 四、HPA API对象: 五、示例&#xff1a; 1、基于CPU的HPA 2、常见问题&#xff1a; 3、基于内存的HPA 一、HPA概述&#xff1a; Horizontal Pod Autoscaler&#xff0c;中文就是水平自动伸缩可…

【洛谷千题详解】P7072 [CSP-J2020] 直播获奖

输入样例&#xff1a; 10 60 200 300 400 500 600 600 0 300 200 100 输出样例&#xff1a; 200 300 400 400 400 500 400 400 300 300 #include<bits/stdc.h> using namespace std; int main() {int n,w,s,a[605]{0};cin>>n>>w;for(int i1;i<n;i){sca…