1️⃣ 冒泡排序(Bubble Sort)

基本思想

  • 重复地比较相邻的两个元素,如果顺序错误就交换它们。
  • 一趟冒泡结束后,最大(或最小)的元素会“浮”到末尾。
  • 下一趟时可以少比较一次,因为最后的元素已经排好。

过程示例(升序)

假设数组:[5, 3, 8, 4, 2]

第一趟比较:

  • (5, 3) → 交换 → [3, 5, 8, 4, 2]
  • (5, 8) → 不换 → [3, 5, 8, 4, 2]
  • (8, 4) → 交换 → [3, 5, 4, 8, 2]
  • (8, 2) → 交换 → [3, 5, 4, 2, 8] ✅ 最大的 8 已到末尾

第二趟比较(不用管最后的 8):

  • (3, 5) → 不换
  • (5, 4) → 交换 → [3, 4, 5, 2, 8]
  • (5, 2) → 交换 → [3, 4, 2, 5, 8] ✅ 次大值 5 已到倒数第二位

… 直到全部有序。

时间复杂度

  • 最坏情况:O(n²)(逆序)
  • 最好情况:O(n)(已排序,可加优化)
  • 空间复杂度:O(1)

Python 代码

def bubble_sort(arr):n = len(arr)for i in range(n):swapped = False  # 优化:如果一趟没交换,说明已排序for j in range(0, n - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]swapped = Trueif not swapped:breakreturn arr# 示例
data = [5, 3, 8, 4, 2]
print(bubble_sort(data))

2️⃣ 选择排序(Selection Sort)

基本思想

  • 每一趟从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。
  • 每趟交换次数固定为 1 次,但比较次数较多。

工作过程示例(升序)

初始数组:[5, 3, 8, 4, 2]

第一趟:

  • [5, 3, 8, 4, 2] 中找到最小值 2
  • 交换 2 和第一个元素 → [2, 3, 8, 4, 5]

第二趟:

  • [3, 8, 4, 5] 中最小值 3(不动) → [2, 3, 8, 4, 5]

第三趟:

  • [8, 4, 5] 中最小值 4
  • 交换 → [2, 3, 4, 8, 5]

第四趟:

  • [8, 5] 中最小值 5
  • 交换 → [2, 3, 4, 5, 8]

时间复杂度

  • 最坏情况:O(n²)
  • 最好情况:O(n²)(比较次数固定)
  • 空间复杂度:O(1)

Python 代码

def selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i + 1, n):if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]return arr# 示例
data = [5, 3, 8, 4, 2]
print(selection_sort(data))

3️⃣ 插入排序(Insertion Sort)

基本思想

  • 将数组分为已排序区未排序区
  • 每次从未排序区取出一个元素,插入到已排序区的合适位置。

工作过程示例(升序)

初始数组:[5, 3, 8, 4, 2]

第一步(i=1):

  • 已排序区 [5]
  • 取 3,插入到 5 前面 → [3, 5, 8, 4, 2]

第二步(i=2):

  • 已排序区 [3, 5]
  • 取 8,放到末尾 → [3, 5, 8, 4, 2]

第三步(i=3):

  • 已排序区 [3, 5, 8]
  • 取 4,插到 5 前面 → [3, 4, 5, 8, 2]

第四步(i=4):

  • 已排序区 [3, 4, 5, 8]
  • 取 2,插到最前面 → [2, 3, 4, 5, 8]

时间复杂度

  • 最坏情况:O(n²)
  • 最好情况:O(n)(已排序)
  • 空间复杂度:O(1)
  • 小规模数据基本有序数据非常快

Python 代码

def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]  # 当前要插入的元素j = i - 1while j >= 0 and arr[j] > key:arr[j + 1] = arr[j]  # 后移j -= 1arr[j + 1] = keyreturn arr# 示例
data = [5, 3, 8, 4, 2]
print(insertion_sort(data))

🔍 对比总结

算法最好时间最坏时间稳定性空间复杂度适用场景
冒泡排序O(n)O(n²)稳定O(1)数据量小,且大致有序
选择排序O(n²)O(n²)不稳定O(1)数据量小,对交换次数敏感
插入排序O(n)O(n²)稳定O(1)数据基本有序,小规模排序

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

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

相关文章

配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题

一、概述 记录时间 [2025-08-16] 在 Docker 学习中&#xff0c;可能会遇到诸如 docker 远程仓库无法访问、docker pull 拉取镜像失败、docker search 查询镜像失败等问题。 这是由于国内网络对 docker 远程仓库的访问受到限制。 那么在国内如何获取 docker 镜像呢&#xff1f…

【Python】Python 面向对象编程详解​

Python 面向对象编程详解​ 文章目录Python 面向对象编程详解​前言一、面向对象的基本概念​1.1 类&#xff08;Class&#xff09;​1.2 对象&#xff08;Object&#xff09;​1.3 属性&#xff08;Attribute&#xff09;​1.4 方法&#xff08;Method&#xff09;​二、类的定…

Redis 缓存和 Redis 分布式锁

目录 Redis 缓存 (Caching) 目的 核心逻辑 存储形式总结 典型场景 Redis 分布式锁 (Distributed Lock) 目的 核心作用 核心逻辑 典型场景 核心区别总结 Redis 缓存 (Caching) 在Redis中&#xff0c;数据是以键值对的形式存储的&#xff0c;其中键总是字符串类型&…

[ java 基础 ] 了解编程语言的第一步

目录 一. IDE (1). 使用IDE的原因: (2). 创建和使用: (3). 常用快捷方式与设置 (4). 注释 (5). 关键字 (6). 标识符 (7). 变量 (8). 数据类型 1) 整数类型 2) 浮点类型 3) 布尔类型(boolean) 4) 字符类型(char) 5) 字符串 6) 基本数据类之间的转换 (9). 运算符…

JavaScript 闭包与递归深度解析:从理论到实战

本文将系统梳理 JavaScript 中闭包与递归的核心概念、实战应用及面试要点,涵盖课堂知识点、作业实现、面试题解析等内容,帮助你全面掌握这两大重要概念。 一、闭包:函数与变量的绑定艺术 1.1 闭包的定义与核心特性 闭包是 JavaScript 中一种特殊的语言现象,其核心定义可…

牛 CDR3 单抗:抗病毒领域的 “纳米级精准导弹”

一、病毒防御的天然克星病毒感染的核心难题在于其表面的 “糖衣炮弹”—— 以 HIV 为例&#xff0c;其 Env 蛋白表面密集的糖链形成物理屏障&#xff0c;传统抗体难以穿透。而牛 CDR3 单抗的超长 CDR H3 结构&#xff08;50-60 个氨基酸&#xff09;如同 “纳米探针”&#xff…

鸿蒙应用开发和Vue网页开发中生命周期的区别

因为下节课就可以写讲解两者生命周期代码的实战了&#xff0c;写介绍一下理论方面的区别&#xff1a;鸿蒙应用开发&#xff08;ArkUI范式&#xff09;与Vue网页开发在生命周期管理上的核心区别&#xff0c;这直接反映了原生OS应用与Web应用在架构哲学和运行环境上的根本差异⚙️…

基于SpringBoot+Vue的轻手工创意分享平台(WebSocket即时通讯、协同过滤算法、Echarts图形化分析)

&#x1f388;系统亮点&#xff1a;WebSocket即时通讯、协同过滤算法、Echarts图形化分析&#xff1b;一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17前端&#xff1…

Java应届生求职八股(5)---并发编程篇

线程基础线程与进程的区别进程是程序的一次执行过程。它资源分配的单位。线程是程序执行的单位。并行和并发的区别单核CPU下&#xff0c;线程串行。&#xff08;并发&#xff1a;多线程轮流使用一个或多个CPU&#xff09;多核CPU下&#xff0c;每个核都可调度线程。&#xff08…

WSL 配置文件 wsl.conf 设置

WSL .wslconfig 小技巧 要在 WSL&#xff08;Windows Subsystem for Linux&#xff09;中增加内存&#xff0c;你需要编辑 WSL 配置文件 wsl.conf 或者直接调整虚拟机的资源限制。 文章目录WSL .wslconfig 小技巧以下是步骤&#xff1a; 找到或创建 .wslconfig 文件&#xff1…

9.从零开始写LINUX内核——设置中断描述符表

Linux 0.12 内核中断描述符表&#xff08;IDT&#xff09;完整实现代码以下是基于 setup 程序扩展的完整代码&#xff0c;包含中断描述符表&#xff08;IDT&#xff09;的定义、初始化及中断处理程序&#xff0c;可直接用于实验验证&#xff1a;asm/* setup.s —— 4 扇区&…

手机实时提取SIM卡打电话的信令声音-当前现状与思考

手机实时提取SIM卡打电话的信令声音-当前现状与思考 --纯手机-无外置配件的方案规划 上一篇&#xff1a;手机实时提取SIM卡打电话的信令声音-新的篇章(篇外小结与思考) 下一篇&#xff1a;手机实时提取SIM卡打电话的信令声音-整体解决方案规划 一、前言 我们在2024年09月的…

【车联网kafka】常用参数及其命令总结(第八篇)

目录 1、kafka参数 1.1 、消费者消息批次发送 1.2 、消息大小的配置(环环相扣的消息大小&#xff0c;调整时需要一起调整) 1.3 、消息重试发送幂等 1.4、消息提交 1.5、分区分配策略&#xff08;自己看的设置&#xff09; 1.6、文件存储 2、kafka命令 2.1 常用命令一览…

基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统

&#x1f525;作者&#xff1a;it毕设实战小研&#x1f525; &#x1f496;简介&#xff1a;java、微信小程序、安卓&#xff1b;定制开发&#xff0c;远程调试 代码讲解&#xff0c;文档指导&#xff0c;ppt制作&#x1f496; 精彩专栏推荐订阅&#xff1a;在下方专栏&#x1…

17.4 合并购物车

分析 用户登录后&#xff0c;将Cookie中的购物车商品合并到redis数据库中。如果此时redis中已经有相同id的商品&#xff0c;则使用Cookie中的数据覆盖redis中的数据。 合并功能需要在用户登录后实现&#xff0c;但登录视图中应避免过多与登录逻辑无关的逻辑&#xff0c;所以考虑…

RK3588消费级8K VR一体机 是否有坑?

​​芯片平台​​​​定位场景​​​​核心优势​​​​消费级功能性短板​​全志H8/RK3288入门级VR低成本、基础性能稳定算力弱&#xff08;4*A55&#xff09;、无NPU、显示分辨率仅1080P高通XR1中端VR/AR均衡性能&#xff08;Adreno 615 GPU&#xff09;仅WiFi5、续航≤4小时…

基于Spring Boot校园二手交易平台系统设计与实现 二手交易系统 交易平台小程序

&#x1f525;作者&#xff1a;it毕设实战小研&#x1f525; &#x1f496;简介&#xff1a;java、微信小程序、安卓&#xff1b;定制开发&#xff0c;远程调试 代码讲解&#xff0c;文档指导&#xff0c;ppt制作&#x1f496; 精彩专栏推荐订阅&#xff1a;在下方专栏&#x1…

Nginx 服务器常用操作

一. Nginx 常用配置 1. Nginx 总配置文件 nginx 安装目录下的 nginx.conf 文件: # 指定 Nginx worker 进程运行的系统用户 user nginx; # 自动根据 CPU 核心数启动相应数量的 worker 进程&#xff0c;充分利用多核。 worker_processes auto; # 自动将 worker 进程绑定到特定 …

PHP官方及第三方下载地址全指南(2025最新版)

PHP官方及第三方下载地址全指南&#xff08;2025最新版&#xff09; 本文整理了PHP官方及主流第三方下载渠道&#xff0c;包含PHP 5.5至8.4各版本的直接下载链接&#xff0c;助您快速获取安全可靠的PHP环境。 一、PHP官方下载渠道 1.1 全球主站下载 网址&#xff1a;https://…

深度剖析Redisson分布式锁项目实战

今天在练手项目中也是遇到了许多新的技术&#xff0c;其中我认为最深刻的还是Redisson分布式锁&#xff0c;这里我就结合一下我项目中用到Redisson分布式锁的代码来讲述一下Redisson分布式锁&#xff0c;希望可以帮助大家更深刻地理解这项技术。在之前的文章中我已经讲过Rediss…