排序算法介绍

ops/2025/1/7 21:26:25/

算法>排序算法是一种将一组数据按照特定顺序进行排列的算法,在计算机科学和数据处理领域中具有重要地位。算法>排序算法的主要目的是将无序的数据元素集合转换为有序的序列,这有助于提高数据的查找、检索和处理效率,以及满足各种应用场景的需求。以下是对常见算法>排序算法的详细解释:

1. 冒泡排序(Bubble Sort)

  1. 基本思想:通过相邻元素的比较和交换,将最大(或最小)的元素逐步“冒泡”到数组的一端。从数组的第一个元素开始,比较相邻的两个元素,如果顺序不对(如前一个元素大于后一个元素,对于升序排序),则交换它们的位置。这样,每一轮比较都会将当前未排序部分的最大元素移动到最后位置,经过多轮比较,直到整个数组有序。
  2. 算法步骤
    • 从数组的第一个元素开始,依次比较相邻的两个元素。
    • 如果前一个元素大于后一个元素,则交换它们的位置。
    • 继续比较下一对相邻元素,直到到达数组的末尾。这完成了第一轮排序,此时最大的元素已经“冒泡”到了数组的最后一个位置。
    • 重复上述步骤,但不包括已经排好序的最后一个元素(因为它已经在正确的位置上),进行第二轮排序,将第二大的元素移动到倒数第二个位置。
    • 不断重复这个过程,直到整个数组有序。
  3. 时间复杂度
    • 平均情况和最坏情况:时间复杂度均为 O ( n 2 ) O(n^2) O(n2),其中 n n n是数组的长度。在最坏情况下,即数组是逆序排列时,需要进行 n − 1 n - 1 n1轮比较,每轮比较都需要进行 n − i n - i ni次比较和交换操作( i i i表示当前轮数),总共的比较和交换次数接近 n 2 / 2 n^2/2 n2/2
    • 最好情况:当数组已经有序时,只需要进行一轮比较,且不需要进行交换操作,时间复杂度为 O ( n ) O(n) O(n)。但这种情况在实际中较少出现,并且冒泡排序的平均性能较差,因此在大规模数据排序时不常用。
  4. 空间复杂度:冒泡排序是一种原地算法>排序算法,只需要额外的常数级空间来交换元素,空间复杂度为 O ( 1 ) O(1) O(1)
  5. 稳定性:冒泡排序是稳定的算法>排序算法,即相等元素的相对顺序在排序前后保持不变。因为在比较和交换元素时,如果两个元素相等,不会进行交换,从而保证了相等元素的原有顺序。

2. 插入排序(Insertion Sort)

  1. 基本思想:将待排序的元素插入到已排序的部分中,从而逐步构建有序序列。从数组的第二个元素开始,将当前元素与已排序部分(初始为第一个元素)的元素依次比较,找到合适的位置插入,使得已排序部分仍然保持有序。
  2. 算法步骤
    • 假设数组的第一个元素已经是有序的,从第二个元素开始,将其视为待插入元素。
    • 从已排序部分的最后一个元素开始向前比较,如果待插入元素小于当前比较元素,则将当前比较元素向后移动一位,为待插入元素腾出位置。
    • 继续向前比较,直到找到合适的位置(即待插入元素大于等于当前比较元素),将待插入元素插入到该位置。
    • 重复上述步骤,对后续的每个元素进行插入操作,直到整个数组有序。
  3. 时间复杂度
    • 平均情况和最坏情况:时间复杂度为 O ( n 2 ) O(n^2) O(n2)。在最坏情况下,即数组是逆序排列时,每次插入都需要移动已排序部分的所有元素,总共需要进行约 n 2 / 2 n^2/2 n2/2次比较和移动操作。在平均情况下,也需要进行大约 n 2 / 4 n^2/4 n2/4次比较和移动操作。
    • 最好情况:当数组已经有序时,每次插入只需要进行一次比较,不需要移动元素,时间复杂度为 O ( n ) O(n) O(n)。插入排序在处理部分有序的数据时表现较好,因为它可以快速地将新元素插入到合适的位置,而不需要进行大量的比较和移动。
  4. 空间复杂度:插入排序是原地算法>排序算法,空间复杂度为 O ( 1 ) O(1) O(1)
  5. 稳定性:插入排序是稳定的算法>排序算法。在插入元素时,如果遇到相等的元素,会将待插入元素插入到相等元素的后面,从而保持相等元素的相对顺序。

3. 选择排序(Selection Sort)

  1. 基本思想:每一轮选择未排序部分的最小(或最大)元素,将其与未排序部分的第一个元素交换位置,从而逐步将最小(或最大)元素放到正确的位置上。
  2. 算法步骤
    • 在未排序部分(初始为整个数组)中找到最小元素的索引。
    • 将最小元素与未排序部分的第一个元素交换位置,此时最小元素已经处于正确的位置(即已排序部分的末尾)。
    • 重复上述步骤,在剩余的未排序部分中继续寻找最小元素并交换位置,直到整个数组有序。
  3. 时间复杂度
    • 平均情况和最坏情况:时间复杂度均为 O ( n 2 ) O(n^2) O(n2)。无论数组的初始状态如何,都需要进行 n − 1 n - 1 n1轮选择操作,每轮需要比较 n − i n - i ni次(

http://www.ppmy.cn/ops/148273.html

相关文章

人工智能知识分享第六天-机器学习_​逻辑回归(Logistic Regression)

简介 在机器学习中,分类问题是一种常见的任务,目标是根据输入特征将数据点分配到不同的类别中。为了实现分类,我们需要训练一个分类器,该分类器能够根据输入数据的特征进行预测。 逻辑回归(Logistic Regression&…

【面试】网络安全常问150道面试题

1,拿到一个待测网站,你觉得应该先做什么? 信息收集: 服务器相关---:## 系统版本,真实IP,开放端口,使用的中间件 指纹信息---## 有无cdn加速,dns解析记录,是不…

MyBatis 动态 SQL 的巧妙运用

一、引言 1.1 MyBatis 的广泛应用 在 Java 开发的世界里,MyBatis 作为一款备受青睐的持久层框架,占据着举足轻重的地位。它以简洁而强大的特性,为开发者们提供了高效的数据访问解决方案,广泛应用于各类项目中。 无论是大型企业…

Spring AOP的工作原理和实现方式

前言 AOP即面向切面编程,它是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑…

缓存-Redis-缓存更新策略-主动更新策略-除了旁路缓存的其他策略

Redis 作为一个高性能的内存数据库,广泛应用于缓存、会话管理、实时分析等场景。在高并发和动态变化的数据环境下,如何有效地更新和维护 Redis 中的数据是一项重要的挑战。主动更新策略(主动刷新策略)旨在确保缓存中的数据始终保持…

Python自学 - 递归函数

1 Python自学 - 递归函数 递归函数是一种在函数体内调用自己的函数,就像“左脚踩着右脚,再右脚踩着左脚… 嗯,你就可以上天了!”。递归函数虽然不能上天,但在处理某些场景时非常好用, 一种典型的场景就是遍…

网络设备安全

21.1 概况 1)交换机安全威胁 交换机是构成网络的基础设备,主要的功能是负责网络通信数据包的交换传输 MAC 地址泛洪(flooding):通过伪造大量的虚假 MAC 地址发往交换机ARP(地址解析协议(Addr…

前端开发【插件】moment 基本使用详解【日期】

moment.js 是一个非常流行的 JavaScript 库,用于处理和操作日期与时间。它提供了丰富的 API 来处理各种日期、时间和格式化的操作。尽管随着 Date API 的增强,moment.js 被视为“过时”,并且推荐使用 date-fns 或 luxon 等库来替代&#xff0…