专题知识点:冒泡排序法
基本思想:冒泡排序是一种简单的交换排序算法,它的核心思路是重复地走访过要排序的数列,一次比较两个相邻的元素,如果它们的顺序错误(比如从小到大排序时,前一个比后一个大)就把它们交换过来。
“冒泡” 的由来:每一轮遍历都会将当前未排序部分中最大的元素逐步 “浮” 到数列的末尾,就像水中的气泡逐渐上浮到水面一样,这也是它名字的由来。
遍历次数:对于一个长度为n的数组,最多需要进行n-1轮遍历(因为每一轮至少确定一个元素的最终位置,最后一个元素会自动归位)。
# 待排序的列表(示例数据)b = [150, 300, 299, 149, 298]# 获取列表的长度(元素个数)n = len(b)# 外层循环:控制排序的轮数,共需要n-1轮(最后一个元素会自动归位)# x表示当前是第x+1轮(x从0开始)for x in range(0, n-1): # 内层循环:控制每一轮中相邻元素的比较和交换 # n-1-x:每完成一轮,末尾的x个元素已排好序,无需再比较,减少循环次数 for y in range(0, n-1-x): # 比较相邻的两个元素:b[y](前一个)和b[y+1](后一个) # 此处条件是b[y]<b[y+1],表示按**降序**排序(大的在前,小的在后) # 如果要升序排序,只需将条件改为b[y]>b[y+1] if b[y] < b[y+1]: # 交换两个元素的位置(Python特有写法,无需临时变量) b[y], b[y+1] = b[y+1], b[y]# 输出排序后的列表print('排序后的b:', b) # 输出:排序后的b: [300, 299, 298, 150, 149]
知识讲解:
排序方向说明:原代码中if b[y]<b[y+1]的条件实现的是降序排序(从大到小),这是新手容易混淆的点,我在注释中特别标注了升序 / 降序的修改方式。
循环次数拆解(以示例为例):
列表长度 n=5,外层循环执行 4 轮(x=0,1,2,3)。
x=0(第 1 轮):内层循环执行 4 次(y=0,1,2,3),把最大的数 300 “浮” 到末尾。
x=1(第 2 轮):内层循环执行 3 次(y=0,1,2),把次大的数 299 “浮” 到倒数第二位。
以此类推,每轮内层循环次数递减,减少不必要的比较。
优化点(可选):如果某一轮内层循环中没有发生任何交换,说明列表已经有序,可以提前终止循环,减少遍历次数(新手可先掌握基础版本,再了解优化)。
知识总结:
冒泡排序的核心是两层循环:外层控制轮数,内层控制每轮的相邻元素比较交换。
每一轮遍历会将当前未排序部分的 “极值”(升序是最大值,降序是最小值)移动到末尾,因此内层循环次数逐轮递减。
排序方向由if条件决定:b[y]>b[y+1]是升序,b[y]<b[y+1]是降序。