Python冒泡排序:简单易懂的算法实现

news/2025/10/28 21:24:57/文章来源:https://www.cnblogs.com/moyume/p/19172768

在编程的世界里,排序算法是数据处理的基础之一。冒泡排序(Bubble Sort)是一种简单且直观的排序算法,虽然它的效率不是最高的,但它非常适合初学者学习排序算法的基本概念。今天,我们就来详细探讨如何在Python中实现冒泡排序。

一、冒泡排序的基本原理

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行,直到没有再需要交换的元素为止,也就是说该数列已经排序完成。

(一)算法步骤

  1. 比较相邻的元素:如果第一个比第二个大(升序)或小(降序),就交换它们。
  2. 重复步骤1:对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数(升序)或最小的数(降序)。
  3. 重复上述步骤:对于所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤:重复步骤1~3,LIBVIO直到没有任何一对数字需要比较。

二、Python实现冒泡排序

(一)升序排序

def bubble_sort(arr):n = len(arr)for i in range(n):# 标志位,用于优化算法swapped = False# 每次遍历到倒数第i个元素即可,因为后面的元素已经排序好了 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 = True# 如果没有发生交换,说明数组已经有序,提前退出if not swapped:breakreturn arr# 测试代码
numbers = [64, 34, 25, 12, 22, 11, 90]
sorted_numbers = bubble_sort(numbers)
print("Sorted array is:", sorted_numbers)

(二)降序排序

def bubble_sort_desc(arr):n = len(arr)for i in range(n):swapped = Falsefor 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# 测试代码
numbers = [64, 34, 25, 12, 22, 11, 90]
sorted_numbers_desc = bubble_sort_desc(numbers)
print("Sorted array in descending order is:", sorted_numbers_desc)

三、冒泡排序的优化

(一)优化思路

冒泡排序的基本实现虽然简单,但在某些情况下效率较低。百思派电影可以通过以下方式优化:

  1. 设置标志位:在每次遍历中设置一个标志位,如果在某次遍历中没有发生交换,则说明数组已经有序,可以提前退出循环。
  2. 减少比较次数:每次遍历后,最大的元素都会被移动到数组的末尾,seedhub因此在下一次遍历时可以减少比较的次数。

(二)优化后的代码

def optimized_bubble_sort(arr):n = len(arr)for i in range(n):swapped = Falsefor 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# 测试代码
numbers = [64, 34, 25, 12, 22, 11, 90]
sorted_numbers_optimized = optimized_bubble_sort(numbers)
print("Sorted array with optimization is:", sorted_numbers_optimized)

四、冒泡排序的时间复杂度

  • 最坏情况:当数组完全逆序时,冒泡排序需要进行(n(n-1)/2)次比较和交换操作toptoon,时间复杂度为(O(n^2))。
  • 最好情况:当数组已经有序时,通过设置标志位,冒泡排序可以在第一次遍历后就提前退出,时间复杂度为(O(n))。
  • 平均情况:在平均情况下,冒泡排序的时间复杂度也是(O(n^2))。

五、总结

冒泡排序是一种简单易懂的排序算法,适合初学者学习排序算法的基本概念。虽然它的效率不是最高的,但通过优化可以提高其性能。在实际应用中,冒泡排序通常用于教学目的或处理小规模数据。对于大规模数据排序,更高效的算法(如快速排序、归并排序等)通常更为合适。

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

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

相关文章

SAM+ARM

一、首先是图像caption的生成。 输入的图像,被输入进BLIP的图像编码器得到图像嵌入,图像嵌入再经过(BLIP Image-grounded Text Decoder) 得到图像caption。ti表示caption的第i个单词,总共有L个单词。 但是,capti…

《代码大全2》观后感(二):需求分析——代码质量的“源头防线”

《代码大全2》观后感(二):需求分析——代码质量的“源头防线” “为什么明明按需求写的代码,最后还是要推翻重写?”这是我过去常有的困惑,直到读了《代码大全2》中“需求分析”的章节,才找到答案:很多时候,我…

NRF54LM20A 芯片的优点

多达 66 个 GPIO 7 个串行接口(SPI、TWI、UART、HS-SPI) 14 位 ADC、全局 RTC(在系统关闭状态下可用)、TDM、PDM、NFC、PWM、QDEC 等 显著降低的功耗 - 与 nRF52 系列相比,典型蓝牙低功耗应用场景下功耗降低约 30-50% …

零散点小总结(25.10.28)

今天练习了Dp,主要把Dp重新看待了一下,有以下几点Dp其实本质是一种表,用于储存子问题的答案 Dp中其实还有枚举,只是由于子问题被存入表中了,所以减少了时间复杂度 一个搜索其实就是Dp的暴力解,有很多的子问题,但…

Top Tree大学习

前言 \(Top Tree\) 用来解决 路径查询,动态 \(dp\) 等问题。 信息储存在 簇 中。 簇(\(Cluster\)) 树上一个边联通块,可以收缩成一条边,我们成这样的联通子图为 簇。 簇上的某些点与其它簇相接,我们称其为簇的 端…

乱学点东西目录

这里记录了各种各样的奇奇怪怪的算法/思路/数据结构,好玩! 乱学点东西#1 :二进制警报器可以自由转载

CFS任务的负载均衡(load balance)

前言 我们描述CFS任务负载均衡的系列文章一共三篇,第一篇是框架部分,第二篇描述了task placement和active upmigration两个典型的负载均衡场景。本文是第三篇,主要是分析各种负载均衡的触发和具体的均衡逻辑过程。 …

EVE-NG导入华为等镜像的方法

镜像下载Dynamips:思科设备真实IOS镜像,类似GNS3,电脑CPU利用率非常高。 IOL:IOU模拟器的镜像,基本完全支持思科设备二、三层功能。 QEMU:这已经不是镜像文件,而是KVM虚拟机安装操作系统后生成的磁盘文件,通常…

(简记)一类支配点对解决区间查询问题

前言:最近好像见了挺多这种题,记录一下。 支配点对 我们经常遇到树上或区间上关于 \(x,y\in[l,r]\) 一类的区间统计问题,且通常要求区间内点两两任意匹配并统计总贡献,这个贡献不具有简单可加性。我们往往通过找支…

2025 云斗

10/27 Contest 5 A:小分讨+dp C:发现是所有的数和它的倍数有限制,对于值域 \(n\) 这样的限制也只有 \(\sum\limits_{i=1}^n\frac{n}{i}=n\log n\) 个,考虑如何表示这些限制。 考虑对于限制 u,v,若两点都不是对方的…

c++ ranges随笔

ranges c++20引入,在<ranges>头文件中 建立在 std::algo 和 iterator基础上,并做了进一步的抽象集成 与之前相比更加的 安全、简洁、方便 // ranges concept template <typename T> concept range = req…

qoj14458. 调色滤镜

qoj14458. 调色滤镜 平面 \([1,10^9]\times[1,10^9]\) 上有 \(n\) 个点,点 \(i\) 位于 \((x,y)\),有颜色 \(c_i\in [0,9]\)。 有 \(q\) 次操作,每次对平面上一个矩形范围内的点的颜色作用映射 \(f:[0,9]\rightarrow…

第8天(中等题 不定长滑动窗口、哈希表)

打卡第八天 3道中等题滑动窗口相当于在维护一个队列。右指针的移动可以视作入队,左指针的移动可以视作出队。 熟练度+++ 可以十几分钟独立写出相似题了^O^/ 耗时≈一小时 明天继续

P10259 [COCI 2023/2024 #5] Piratski kod

题链 题意 首先,题目写的很抽象,模拟赛时读了半个小时才读懂 题意概括一下就是枚举长度为k的所有01串 然后对01串进行划分,每遇到两个1就进行一次划分 然后把每段提取出来单独处理 如果把提出来的01串计为\(s[1...r]\)…

巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理

需求:在多个方法前后输出日志 logger.Info("begin"); method(); logger.Info("end");如果需要在方法后输出日志同时加上时长 logger.Info("begin"); var sw= Stopwatch.StartNew(); me…

2025.10.27训练记录

其实是10.28晚上写的。感觉就这个题要记录一下。 上午noip模拟。喜提一道不会。 B 题外话: 7:45 开始考试,广附集训爷大吼一声我做过!声称A完全不可做,但B他场切了。于是我开场看B。 那就看B,7:50闭了一下眼睛,睁…

软考复习总结

距离软考还有不到十天,主要对学习的知识点进行总结回顾(以下知识点无顺序重点): 1.对于尾数用补码进行表示时,要注意如果机器位8位,已知补码包含一位符号位,则补码真值的范围(-2n-1,2n-1 - 1), 则将其转换为…

实用指南:Eclipse 透视图(Perspective)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

? #6

100 + 0 + 80 + 0 = 180, Rank 2/6.2024暑期CSP-S&NOIP模拟赛第8套题⾯ 链接:link 题解:暂无 时间:4h (2025.10.28 14:00~18:00) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\) \(\color{#FFC116} 黄\)*1000 …

鲜花:不会说明你有抑郁症3

这回是广为人知题了。自然数幂和:给定 \(n,k\),求 \(\sum_{i=1}^{n} i^k\),\(n\le 10^{18},k\le 2000\)。本来以为用扰动法求自然数幂和很猎奇,结果一搜出来十来篇博客。唉我还是太菜了。 尝试扰动法处理。 设: \…