当前位置: 首页 > news >正文

简洁思维:python实现插入排序、冒泡排序和选择排序

一、插入排序(Insertion Sort)
实现思路:
插入排序的核心思想是:将数组分为「已排序区间」和「未排序区间」,初始时已排序区间只有第一个元素。然后依次从未排序区间中取出元素,插入到已排序区间的合适位置(保证已排序区间始终有序),重复此过程直到未排序区间为空。
类比生活中整理扑克牌:抓牌时,每抓一张就按大小插入到手中已有序的牌堆里。

`
def insertion_sort(arr):

遍历未排序区间(从第二个元素开始,索引1到末尾)

for i in range(1, len(arr)):# 当前要插入的元素(未排序区间的第一个元素)current = arr[i]# 已排序区间的末尾索引(初始为i-1)j = i - 1# 在已排序区间中找到current的插入位置# 若j >=0且已排序元素大于current,将其右移一位while j >= 0 and arr[j] > current:arr[j + 1] = arr[j]  # 元素右移j -= 1# 将current插入到正确位置(j+1是插入索引)arr[j + 1] = current
return arr

`

代码详解:
外层循环 for i in range(1, len(arr)):从索引 1 开始(第一个元素默认有序),依次处理未排序区间的元素。
current = arr[i]:记录当前要插入的元素(避免后续移位时被覆盖)。
内层循环 while j >= 0 and arr[j] > current:从已排序区间的末尾向前遍历,若元素大于current,则将其右移一位(为current腾出位置)。
arr[j + 1] = current:当找到小于等于current的元素(或已遍历完已排序区间),将current插入到该元素的右侧(j+1位置)。
特点:稳定排序(相等元素相对位置不变),
时间复杂度 O(n^2)(最坏 / 平均),
空间复杂度 O(1)(原地排序)。

二、冒泡排序(Bubble Sort)
实现思路:
冒泡排序的核心思想是:重复遍历数组,每次比较相邻的两个元素,若顺序错误则交换它们。每一轮遍历会将最大的元素 “冒泡” 到数组末尾(如同水中气泡上浮),重复n-1轮后数组有序。
优化点:若某一轮遍历中没有发生交换,说明数组已完全有序,可提前退出。

def bubble_sort(arr): n = len(arr) # 外层循环控制需要多少轮(最多n-1轮) for i in range(n - 1): swapped = False # 标记本轮是否发生交换 # 内层循环比较相邻元素(每轮后最大元素已到位,无需再比较) for j in range(n - 1 - i): # 若前一个元素大于后一个,交换它们 if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] swapped = True # 若本轮无交换,说明数组已有序,提前退出 if not swapped: break return arr

代码详解:
外层循环 for i in range(n - 1):最多需要n-1轮(每轮确定一个最大元素的位置)。
swapped 标记:用于优化,若某轮未交换元素,说明数组已有序,直接退出。
内层循环 for j in range(n - 1 - i):每轮比较范围随i增大而减小(因为末尾i个元素已排好序)。
交换操作 arr[j], arr[j + 1] = ...:相邻元素逆序时交换,确保大元素 “上浮” 到右侧。
特点:稳定排序,时间复杂度 (O(n^2))(最坏 / 平均)、(O(n))(最好,已排序时),空间复杂度 (O(1))(原地排序)。

三、选择排序(Selection Sort)
实现思路
选择排序的核心思想是:将数组分为「已排序区间」和「未排序区间」,初始时已排序区间为空。每一轮从未排序区间中找到最小元素,将其与未排序区间的第一个元素交换,此时该元素加入已排序区间,重复n-1轮后数组有序。
类比生活中挑苹果:每次从一堆苹果里挑出最小的,放到已选好的一堆的末尾。

def selection_sort(arr): n = len(arr) # 外层循环控制已排序区间的末尾(最多到n-2,最后一个元素自动有序) for i in range(n - 1): # 记录未排序区间中最小元素的索引(初始假设第一个元素最小) min_index = i # 遍历未排序区间,找到真正的最小元素索引 for j in range(i + 1, n): if arr[j] < arr[min_index]: min_index = j # 将最小元素与未排序区间的第一个元素交换 arr[i], arr[min_index] = arr[min_index], arr[i] return arr

代码详解:
外层循环 for i in range(n - 1):i 是已排序区间的末尾索引(初始为 0,每轮扩展 1 位)。min_index = i:假设未排序区间的第一个元素(arr[i])是最小的。
内层循环 for j in range(i + 1, n):遍历未排序区间的剩余元素,更新min_index为真正的最小元素索引。
交换操作 arr[i], arr[min_index] = ...:将最小元素放到已排序区间的末尾(i位置)。
特点:不稳定排序(相等元素可能因交换改变相对位置),时间复杂度 (O(n^2))(所有情况),空间复杂度 (O(1))(原地排序)。

http://www.rkmt.cn/news/43634.html

相关文章:

  • 2025 年 11 月不锈钢酸洗钝化液厂家推荐排行榜,环保型不锈钢管酸洗钝化液,不锈钢清洗钝化液,酸洗钝化处理与不锈钢清洗剂公司推荐
  • 2025 年 11 月 Type-C 连接器厂家推荐排行榜,Type-C 连接器分析,Type-C 连接器模具,高性能连接方案专业制造商精选
  • 2025年深圳保税区域一日游机构权威推荐榜单:综合保税区域一日游/保税地区一日游/保税区一日游源头机构精选
  • 2025 年 11 月不锈钢水箱厂家推荐排行榜,不锈钢方形水箱,组合式水箱,消防水箱,生活水箱,保温水箱,承压水箱,不锈钢水塔公司推荐
  • python:python执行js
  • flask:模板用extends扩充页面内容
  • flask: 用模板渲染html页面
  • flask: 处理路由错误
  • 2025年广州消泡剂TSF-825公司权威推荐榜单:消泡剂681F/消泡剂S600/消泡剂691F源头公司家精选
  • OCX与C# 之一:初始OCX
  • 2025 年 11 月双面胶厂家推荐排行榜,AB双面胶,易撕贴双面胶,撕膜胶带双面胶,高粘易撕贴双面胶,花边胶双面胶,耐高温双面胶公司推荐
  • 2025 年 11 月防水网厂家推荐排行榜,防水网,味头防水网,专业防水网源头厂家实力解析与口碑之选
  • Rokid JSAR 技术开发全指南:基于 Web 技术栈的 AR 开发实战 - 实践
  • 不用自己封装大模型!JBoltAI 框架为 Java AI 开发提供稳定 AI 应用支撑
  • 财务报销 + 智慧采购!JBoltAI 框架为 Java 企业打造场景化 AI 应用窗口
  • 向量库 + Embedding 模型!JBoltAI 框架帮 Java 团队搭建高精度 AI 应用知识库
  • 2025年高活性氢氧化钙厂家权威推荐榜单:熟石灰/高比表氢氧化钙/氢氧化钙颗粒源头厂家精选
  • 行业方案 + VIP 支持!JBoltAI 框架全程帮 Java 团队搞定 AI 应用落地难题
  • 老Java系统想加AI能力?JBoltAI框架帮改造,AI应用无缝衔接旧系统
  • 《ESP32-S3使用指南—IDF版 V1.6》第四十六章 SD卡模拟U盘实验
  • 2025年打包箱房制造企业权威推荐榜单:隔离房/创意集装箱/彩钢房源头厂家精选
  • 2025年知名的冷拉型钢杭州老房装修
  • 2025年管母线厂家综合实力排行榜:全绝缘铜管母线/管型母线/全屏蔽绝缘铜管母线领先厂家精选
  • 2025年6月deepseek排名优化跨平台能力推荐排行榜
  • 2025年M14连接器插座厂家权威推荐榜单:M14焊线式插座/M14成型式针型插头/M14成型连接器插头源头厂家精选
  • CSP 2025 考前摆烂记
  • 2025年六月AI搜索优化服务商推荐榜全场景指南
  • 精美的Vue可视化流程设计器
  • 2025年院线护肤品供货厂家权威推荐榜单:美容院线产品/美容院护肤品/院线产品源头厂家精选
  • 家理律所联系方式: 官网与微信使用指南