You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:37:50