【数据结构】排序算法

简介: 【数据结构】排序算法

🎏排序的定义

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

排序的定义:

假设含n个记录的序列为 其相应的关键字序列为 需确定1,2,...,n的一种排列 ,使其相应的关键字满足如下的非递减(或非递增)关系.

,即使 成为一个按关键字有序的序列 ,这样一种操作称为排序.


🎏排序的稳定性

📌稳定性的定义

假设关键字序列为: ,其中 ,且在排序前的序列中 领先于 (即i<j).如果排序后 仍领先于 ,则称所用的排序方法是稳定的;反之,若可能使得排序后的序列中 领先 ,则称所用的排序方法是不稳定的.

📌稳定性的意义

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

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

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

🎏内排序与外排序

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

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


🎏八大内排序

📌冒泡排序

它的基本思想是:

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

算法演示动图如下:

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

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

https://blog.csdn.net/weixin_72357342/article/details/129173919?spm=1001.2014.3001.5502


📌希尔排序

它的基本思想是:

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

算法动图演示如下:

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

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

https://blog.csdn.net/weixin_72357342/article/details/135043566


📌直接插入排序

它的基本操作是:

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

算法动图演示如下:

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

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

https://blog.csdn.net/weixin_72357342/article/details/135038521?spm=1001.2014.3001.5502


📌简单选择排序

它的基本操作是:

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

算法动图演示如下:

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

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

https://blog.csdn.net/weixin_72357342/article/details/135059302?spm=1001.2014.3001.5502


📌堆排序

它的基本思想是:

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

算法动图演示:

1.向下调整建堆

逻辑结构:

物理结构:

2.堆排序(升序)

逻辑结构:

物理结构:

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

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

https://blog.csdn.net/weixin_72357342/article/details/135059322?spm=1001.2014.3001.5502


📌快速排序

它的基本思想是:

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

算法动图演示:

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

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

https://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路归并排序.

算法动图演示如下:

算法逻辑演示:

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

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

【数据结构】八大排序算法之归并排序算法

https://blog.csdn.net/weixin_72357342/article/details/135059352


📌计数排序

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

计数排序的实现思路:

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

算法动图演示如下:

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

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

【数据结构】八大排序之计数排序算法

https://blog.csdn.net/weixin_72357342/article/details/135059360


🎏结语

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

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


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

 


相关文章
|
23天前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
34 1
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
24天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
24天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
98 23
|
1月前
|
算法
数据结构之蜜蜂算法
蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
60 20
|
1月前
|
机器学习/深度学习 算法 C++
数据结构之鲸鱼算法
鲸鱼算法(Whale Optimization Algorithm,WOA)是由伊朗研究员Seyedali Mirjalili于2016年提出的一种基于群体智能的全局优化算法,灵感源自鲸鱼捕食时的群体协作行为。该算法通过模拟鲸鱼的围捕猎物和喷出气泡网的行为,结合全局搜索和局部搜索策略,有效解决了复杂问题的优化需求。其应用广泛,涵盖函数优化、机器学习、图像处理等领域。鲸鱼算法以其简单直观的特点,成为初学者友好型的优化工具,但同时也存在参数敏感、可能陷入局部最优等问题。提供的C++代码示例展示了算法的基本实现和运行过程。
50 0
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
41 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
1月前
|
算法 vr&ar 计算机视觉
数据结构之洪水填充算法(DFS)
洪水填充算法是一种基于深度优先搜索(DFS)的图像处理技术,主要用于区域填充和图像分割。通过递归或栈的方式探索图像中的连通区域并进行颜色替换。本文介绍了算法的基本原理、数据结构设计(如链表和栈)、核心代码实现及应用实例,展示了算法在图像编辑等领域的高效性和灵活性。同时,文中也讨论了算法的优缺点,如实现简单但可能存在堆栈溢出的风险等。
42 0
|
2月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
45 4