如何将这段Python排序代码模块化,支持可变次数与输入数据?
模块化重构后的冒泡排序实现
先看重构后的可复用代码:
from random import randint def bubble_sort(arr, print_steps=False): n = len(arr) sorted_arr = arr.copy() # 避免修改原输入数组 for i in range(n - 1): swapped = False # 每轮只比较未排序的前n-1-i个元素 for j in range(n - 1 - i): if sorted_arr[j] > sorted_arr[j + 1]: # 交换相邻元素,Python支持直接解包交换,不用temp变量 sorted_arr[j], sorted_arr[j + 1] = sorted_arr[j + 1], sorted_arr[j] swapped = True if print_steps: print(f"Step {i*(n-1) + j + 1}: {sorted_arr}") # 本轮无交换,说明数组已完全有序,提前结束 if not swapped: break return sorted_arr # 生成任意长度的随机测试数组(这里是4个元素,可修改range参数调整长度) input_arr = [randint(1, 100) for _ in range(4)] print("Starting value:", input_arr) # 调用排序函数,开启步骤打印 sorted_result = bubble_sort(input_arr, print_steps=True) print("Final sorted result:", sorted_result)
重构思路与逻辑拆解
1. 封装为独立函数
把排序逻辑封装成bubble_sort函数,核心参数arr接受任意长度的输入数组,print_steps作为可选开关控制是否打印排序过程。这样函数可以反复调用,处理不同的输入数据,符合模块化复用的要求。
2. 适配任意长度输入
- 用
n = len(arr)动态获取数组长度,替代原代码中硬编码的a[0]、a[1]等固定索引,彻底摆脱只能处理4个元素的限制。 - 内层循环
range(n - 1 - i):每一轮排序后,末尾的i个元素已经是有序的最大值,所以下一轮不需要再比较这些元素,减少不必要的遍历次数。
3. 动态控制遍历次数
- 外层循环最多执行
n-1次(因为每轮至少确定一个元素的最终位置),但加入swapped标记后,如果某一轮没有发生任何元素交换,说明数组已经完全有序,直接跳出循环,避免无效遍历,优化了原代码的低效问题。 - 原代码的
passed变量逻辑存在缺陷(每次比较都会累加,可能导致错误提前终止),swapped标记则能准确判断数组是否有序。
4. 细节优化
- 用Python的解包交换替代原代码的
temp变量,简化交换逻辑。 - 复制原数组进行排序,避免修改输入的原数组,减少函数副作用,让函数的行为更可预测。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

