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

Python 新手入门,第一个排序算法怎么写

为什么从冒泡排序开始很多刚接触 Python 的朋友一听到“算法”两个字就觉得头大仿佛要面对什么高深的数学公式或者复杂的逻辑迷宫。其实算法的本质就是解决问题的步骤。就像你整理书架上的书总得有个顺序是按作者名字排还是按书名高低排这个“整理的过程”就是算法。在众多的排序算法中冒泡排序Bubble Sort虽然在实际工程中效率不是最高的但它绝对是新手入门的“最佳陪练”。它的逻辑非常直观几乎不需要额外的数据结构知识只需要理解最基础的循环和条件判断就能掌握。更重要的是它能完美地展示计算机是如何通过“比较”和“交换”来让数据变得有序的。今天我们就抛开那些枯燥的理论定义直接动手用 Python 写出你的第一个排序算法。算法核心逻辑像气泡一样浮上来想象一下你有一杯刚倒好的汽水里面有很多小气泡。这些气泡大小不一代表了我们数组里乱序的数字。冒泡排序的名字由来就是因为最大的那个数字或者说最重的元素会像水里的大气泡一样经过不断的比较和交换慢慢地“浮”到数列的最顶端也就是数组的末尾。这个过程具体是怎么发生的呢我们可以把它拆解成两个关键动作相邻比较从头开始拿着第一个数和第二个数比。如果前面的数比后面的大那就把它们俩的位置互换如果前面的已经比后面小了那就保持不动。重复推进接着拿第二个数和第三个数比重复上面的动作。一直比到这一轮的最后一个数。当你把这一整套动作从头到尾做了一遍后你会发现整个数组里最大的那个数一定已经被挪到了最后面。这就好比第一轮比赛结束冠军已经诞生了并且站到了领奖台的最右侧。接下来我们只需要对剩下的那些还没排好序的数重复同样的过程。第二轮结束后第二大的数就会停在倒数第二的位置。如此循环往复直到所有的数都各就各位。这里有一个非常关键的概念也是新手最容易晕的地方双重循环。外层循环控制我们要进行多少轮“冒泡”。如果有 N 个数理论上我们需要 N-1 轮就能排完因为最后一个数自然就位了。内层循环负责在每一轮里执行具体的“相邻比较”和“交换”动作。随着轮数增加后面已经排好的数就不需要再参与了所以内层循环的范围会逐渐缩小。代码实战逐行拆解与注释光说不练假把式。下面这段代码就是完整的冒泡排序实现。我会像带着你写代码一样把每一行的意图都讲清楚。你可以直接把这段代码复制到你的 Python 编辑器里运行。def bubble_sort(arr): # 获取列表的长度也就是我们要处理的元素个数 n len(arr) # 外层循环控制排序的轮数 # 范围是 0 到 n-1意味着我们最多需要进行 n-1 轮比较 for i in range(n): # 标记变量用于优化算法 # 假设这一轮开始时列表已经是有序的了 swapped False # 内层循环负责每一轮的具体比较工作 # 注意这里的范围n - 1 - i # 为什么要减 i因为每一轮结束后末尾的 i 个元素已经是最大的且有序的了不需要再比较 for j in range(0, n - 1 - i): # 核心逻辑比较相邻的两个元素 # 如果前一个元素 (arr[j]) 大于后一个元素 (arr[j1]) if arr[j] arr[j 1]: # 交换位置 # Python 特有的语法糖不需要临时变量就能直接交换 arr[j], arr[j 1] arr[j 1], arr[j] # 既然发生了交换说明列表之前并不是有序的 swapped True # 优化检查如果在这一轮完整的内层循环中一次交换都没有发生 # 说明列表已经完全有序了我们可以提前结束不用再跑剩下的轮数 if not swapped: break # 测试数据一个乱序的整数列表 numbers [64, 34, 25, 12, 22, 11, 90] print(排序前的列表:, numbers) bubble_sort(numbers) print(排序后的列表:, numbers)重点细节解析在这段代码中有几个地方值得你停下来仔细琢磨首先是range(0, n - 1 - i)这个写法。很多初学者会直接写成range(n)这虽然也能跑通但效率很低。试想一下第一轮结束后最大的数已经在最后了第二轮再比较到最后一个是毫无意义的因为它肯定比前面的大。减去i就是为了避免这种无效劳动让内层循环的范围随着外层轮数的增加而动态缩小。其次是swapped标志位的使用。这是一个很好的编程习惯。假如你传入的列表本来就是[1, 2, 3, 4, 5]如果没有这个优化程序还是会傻傻地跑完所有外层循环做大量无用的比较。有了它程序在内层循环发现一次交换都没发生时就会立刻break跳出极大地提升了在“基本有序”情况下的性能。最后是 Python 的交换语法a, b b, a。在其他语言如 C 或 Java 中你可能需要定义一个temp临时变量来暂存数据才能交换但在 Python 里这一行代码就优雅地解决了问题既简洁又易读。运行结果与可视化观察当你运行上面的代码时控制台会输出以下内容排序前的列表[64, 34, 25, 12, 22, 11, 90] 排序后的列表[11, 12, 22, 25, 34, 64, 90]为了让你更清楚地看到“冒泡”的过程我们可以稍微修改一下代码在每次交换时打印出当前的状态实际开发中当然不会这么做但这对于学习非常有用# 仅用于演示过程的简化版片段 arr [5, 1, 4, 2, 8] n len(arr) for i in range(n): for j in range(0, n - 1 - i): if arr[j] arr[j 1]: arr[j], arr[j 1] arr[j 1], arr[j] print(f交换了 {arr[j1]} 和 {arr[j]} - 当前列表{arr})运行这段演示代码你会看到数字8是如何一步步从中间位置经过多次交换最终“浮”到最右边的。紧接着是5然后是4……这种动态的变化过程能帮你建立起对算法执行流的直观感受。你会发现越往后的轮次需要移动的距离越短因为后面的“大块头”都已经就位了。新手常见错误排查在自己动手尝试时你可能会遇到一些典型的“坑”提前了解这些能帮你节省不少调试时间。1. 索引越界错误IndexError这是最常见的报错。通常发生在内层循环的范围设置上。如果你写成了range(n - i)那么当j取到最大值时j 1就会等于n而列表的最大索引是n - 1。访问arr[n]自然会报错。解决方法务必记住内层循环的上限是n - 1 - i确保j 1永远不会超出列表边界。2. 缩进混乱导致逻辑失效Python 对缩进非常敏感。如果把if not swapped: break这句话缩进错了层级比如缩进了内层循环里那么只要有一次没交换循环就会立即终止导致排序只进行了一半。解决方法检查break语句是否与内层的for循环对齐它应该是在内层循环完全结束后才执行的判断。3. 混淆了“原地排序”与“返回值”上面的bubble_sort函数没有return任何值因为它直接修改了传入的列表原地排序。有些新手会在调用后写new_list bubble_sort(numbers)然后打印new_list结果发现是None。解决方法理解 Python 列表的可变性。直接打印原列表numbers即可看到排序结果或者在函数末尾显式加上return arr。4. 比较方向搞反如果你想实现从大到小排序却仍然使用if arr[j] arr[j 1]那结果依然是从小到大。解决方法想要降序排列只需将大于号改为小于号逻辑就变成了“如果前面的比后面的小就交换”这样小的数就会慢慢浮上去大的数沉下来。动手练习建议看懂了不代表学会了。建议你关掉代码尝试自己在空白文件里重新写一遍冒泡排序。可以先从一个只有 5 个数字的列表开始手动模拟一遍交换过程然后再敲代码验证。试着修改一下代码让它支持用户输入任意一组数字进行排序或者挑战一下统计一下你的算法到底进行了多少次比较和交换。这些小小的变式练习能帮你把“双重循环”的逻辑彻底刻在脑子里。当你能够不假思索地写出这个结构时恭喜你你已经正式迈过了算法入门的第一道门槛接下来的归并排序、快速排序等更高级的算法也不过是在此基础上的演变而已。

相关文章:

Python 新手入门,第一个排序算法怎么写

为什么从冒泡排序开始? 很多刚接触 Python 的朋友,一听到“算法”两个字就觉得头大,仿佛要面对什么高深的数学公式或者复杂的逻辑迷宫。其实,算法的本质就是解决问题的步骤。就像你整理书架上的书,总得有个顺序&#x…...

Baklib × OPC:从“发算力”到“发生产力”,为超级个体打造一站式数字经营护航体系

在 AI 浪潮重塑商业模式的今天,“一人即公司”(OPC,One-Person Company)不再是一个超前的概念,而是一股正在席卷全球的创业新浪潮。从成都发布首批 OPC 社区能力清单,到各地政府将“超级个体”视为未来经济…...

QuickLook Video完整指南:让macOS原生支持数百种视频格式预览

QuickLook Video完整指南:让macOS原生支持数百种视频格式预览 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https:/…...

如何用OpCore Simplify在30分钟内完成黑苹果EFI配置:从技术困惑到轻松上手的完整指南

如何用OpCore Simplify在30分钟内完成黑苹果EFI配置:从技术困惑到轻松上手的完整指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是…...

Phi-mini-MoE-instruct部署案例:2.4B激活参数轻量MoE模型落地实操

Phi-mini-MoE-instruct部署案例:2.4B激活参数轻量MoE模型落地实操 1. 项目介绍 Phi-mini-MoE-instruct是一款轻量级混合专家(MoE)指令型小语言模型,采用创新的MoE架构设计,在保持高性能的同时大幅降低计算资源需求。…...

SteamShutdown智能关机终极指南:告别下载后电脑空转的烦恼

SteamShutdown智能关机终极指南:告别下载后电脑空转的烦恼 【免费下载链接】SteamShutdown Automatic shutdown after Steam download(s) has finished. 项目地址: https://gitcode.com/gh_mirrors/st/SteamShutdown 还在为Steam下载完成后电脑整夜运行而烦恼…...

终极指南:5分钟快速掌握TensorFlow Lite Micro嵌入式AI部署

终极指南:5分钟快速掌握TensorFlow Lite Micro嵌入式AI部署 【免费下载链接】tflite-micro Infrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal processors). …...

用 5 秒视频讲述精彩开场:Pika 视频生成 API,短内容的突破点

在短内容的时代,第一印象决定了你是否还有机会讲述你的故事。Ace Data Cloud 的 Pika 视频 API 允许你将“励志句子/参考图像/参考视频”转换为 5-6 秒的高质量动态效果,非常适合短视频开场、产品亮点、表情包、动画广告和节目介绍等场景。 环境准备/前…...

IDM试用重置工具:告别30天限制的智能解决方案

IDM试用重置工具:告别30天限制的智能解决方案 【免费下载链接】idm-trial-reset Use IDM forever without cracking 项目地址: https://gitcode.com/gh_mirrors/id/idm-trial-reset 你是否曾经遇到过这样的情况:正在下载重要文件时,ID…...

从‘星下点’到‘零多普勒’:拆解SAR几何,帮你避开遥感图像配准的坑

从‘星下点’到‘零多普勒’:拆解SAR几何,帮你避开遥感图像配准的坑 当你在ENVI中打开两幅不同时相的SAR图像准备做变化检测时,是否遇到过明明选择了相同的投影坐标系,但同名地物始终无法精确对齐的情况?这种配准失败往…...

别再买分立元件了!用Matlab脚本快速设计微带线等效电感电容(附ADS验证)

射频PCB设计革命:用Matlab脚本实现微带线等效LC元件的工程实践 在毫米波和5G时代,射频电路设计工程师们正面临着一个共同的困境:如何在有限的PCB空间内实现高性能的LC元件布局?传统的高频贴片电感和电容不仅价格昂贵、供货周期长&…...

SeuratWrappers终极指南:如何用3步解锁单细胞分析扩展工具集

SeuratWrappers终极指南:如何用3步解锁单细胞分析扩展工具集 【免费下载链接】seurat-wrappers Community-provided extensions to Seurat 项目地址: https://gitcode.com/gh_mirrors/se/seurat-wrappers 单细胞分析扩展工具集SeuratWrappers是生物信息学领域…...

智慧农业之草莓成熟度识别数据集 yolo detr算法草莓采摘点识别图像数据集 草莓目标检测数据集 粉色红色青涩草莓数据集271期

草莓目标检测数据集核心信息简介草莓目标检测数据集核心信息表信息类别具体内容数据集类别目标检测类数据集,专注于草莓外观颜色分类,包含粉色(pink)、红色(red)、白色(white)3 个核…...

Pixel Aurora Engine 移动开发前瞻:为 Android Studio 项目生成应用图标与 UI 素材

Pixel Aurora Engine 移动开发前瞻:为 Android Studio 项目生成应用图标与 UI 素材 1. 移动开发者的素材困境 每个Android开发者都经历过这样的痛苦:项目进入UI开发阶段后,设计师交付的素材往往需要手动处理成各种尺寸和格式。从应用图标到…...

[特殊字符]【跨界应用实战】降维打击!基于 Transformer 的金融与时序数据建模硬核指南

🚀【跨界应用实战】降维打击!基于 Transformer 的金融与时序数据建模硬核指南摘要:前六篇我们将 AI Infra 的底层基础设施(算力、显存、多线程)翻了个底朝天。今天,我们切换视角,聊聊深度学习的…...

[特殊字符]【AI Infra 核心】深度学习引擎底层的秘密:用现代 C++ 徒手实现高性能显存池

🚀【AI Infra 核心】深度学习引擎底层的秘密:用现代 C 徒手实现高性能显存池摘要:平时写 PyTorch,大家习惯了大手一挥 tensor.to(cuda),仿佛显存是无限且无代价的。但当你真正深入 AI 框架底层(如 PyTorch …...

别再纠结选哪个了!根据你的项目需求,手把手教你判断该用ArcGIS Pro还是传统ArcMap

ArcGIS Pro与ArcMap实战选型指南:五维度精准匹配项目需求 当你站在GIS项目规划的十字路口,面对ArcGIS Pro和ArcMap这两款标志性软件时,选择困难症很容易发作。这不是简单的"新旧版本"之争,而是关乎项目效率、团队协作和…...

【AI Infra 核心】图解 FlashAttention:长上下文推理背后的“内存墙”革命与底层优化思维

🚀【AI Infra 核心】图解 FlashAttention:长上下文推理背后的“内存墙”革命与底层优化思维摘要:现在的大模型,上下文窗口从 8K 卷到 128K,甚至百万级别(如 Gemini 1.5 Pro)。但如果你用过早期的…...

如何用3个简单步骤神奇掌握浏览器视频下载魔法

如何用3个简单步骤神奇掌握浏览器视频下载魔法 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过这样的情况:在网上看到…...

国产替代之2SK3821-E与VBL1104N参数对比报告

N沟道功率MOSFET参数对比分析报告一、产品概述2SK3821-E:安森美(onsemi)N沟道硅MOSFET,耐压100V,具备低导通电阻、4V驱动和超高速开关能力,保证雪崩耐量。适用于通用开关、电机驱动、DC/DC转换器等应用。VB…...

从零开始做 TikTok,2026 年最新实操攻略

很多朋友私信问我,想做 TikTok 但不知道怎么入门。这里我整理了一套完整的操作流程,按步骤来就行。### 🔑 为什么选择 TikTok 平台? 1. 海量海外用户,覆盖全球主要市场 2. 新号冷启动难度低,内容即流量 3. …...

Unity工业数字孪生实战:用S7.NET高效读写西门子PLC数据(避坑Read方法)

Unity工业数字孪生性能优化:S7.NET高效读写西门子PLC数据实战 在工业数字孪生项目中,实时数据同步是系统成败的关键。想象一下,当你精心构建的虚拟产线模型因为7秒的数据延迟而失去价值,这种体验对任何开发者来说都是噩梦。本文将…...

2026年怎么部署Hermes/OpenClaw?腾讯云环境搭建及token Plan教程

2026年怎么部署Hermes/OpenClaw?腾讯云环境搭建及token Plan教程。OpenClaw和Hermes Agent是什么?OpenClaw和Hermes Agent怎么部署?如何部署OpenClaw/Hermes Agent?2026年还在为部署OpenClaw和Hermes Agent到处找教程踩坑吗&#…...

Cursor Pro破解工具:如何永久免费使用AI编程助手?

Cursor Pro破解工具:如何永久免费使用AI编程助手? 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached y…...

Python字典update()踩坑实录:为什么你的列表更新总报错‘length 1; 2 is required’?

Python字典update()方法深度解析:如何避免键值对长度错误 1. 问题现象与常见场景 最近在Stack Overflow上看到一个高频问题:为什么使用update()方法更新字典时,系统会抛出ValueError: dictionary update sequence element #0 has length 1; 2…...

如何永久解决IDM激活弹窗:开源脚本完整使用指南

如何永久解决IDM激活弹窗:开源脚本完整使用指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager(IDM&#xff…...

免费多语言编程学习资源大集合:含书籍、课程、播客,点击即享!

资源查找 你可以在 https://ebookfoundation.github.io/free-programming-books-search/ 搜索该列表。此页面以易于阅读的网站形式呈现,点击即可访问。 资源简介 该列表最初是 StackOverflow "免费编程书籍列表"的复刻版本,由 Karan Bhangui 和…...

曦智科技港股上市涨幅383%,低调沂景资本背后竟是400亿身家山东大亨!

曦智科技上市成现象级IPO今年港股IPO首日涨幅最大的公司是刚刚上市的曦智科技。截至收盘,曦智股价大涨383%,市值飙升至814亿港元,成为上半年的现象级IPO。“麻省理工物理学博士”“价值1亿的Nature论文”,天才科学家沈亦晨的创业故…...

模型部署2___踝关节解算1

代码参考:https://github.com/Roboparty/atom01_deploy/tree/main 代码解读: //////********************inverse kinematics*****************////// InsKinematicsResult Decouple::inverse_kinematics(double q_roll,double q_pitch, bool leftLegF…...

如何彻底解决多语言应用兼容性问题:Locale Remulator终极配置指南

如何彻底解决多语言应用兼容性问题:Locale Remulator终极配置指南 【免费下载链接】Locale_Remulator System Region and Language Simulator. 项目地址: https://gitcode.com/gh_mirrors/lo/Locale_Remulator Locale Remulator是一款基于Detours技术的系统区…...