zoukankan      html  css  js  c++  java
  • Python-冒泡排序

    题目: 有一个纯数字的无序列表, 要求对列表进行排序.

    例如: lst = [3, 2, 10, 8, 5, 15, 1]

    解决思路:

    1. 先拿列表的头两个元素进行比较, 如果第一个元素大, 将第一个和第二个元素互换位置, 这时较大的元素在第二个位置;再拿第二个和第三个元素进行比较, 将较大的元素放在第三个位置; 依次进行下 去, 当比较完倒数第一、二个元素后,就完成了最大元素的筛选, 放在了最后一个位置.

    2. 我们重复进行步骤1的操作, 就是对所有的元素从最左侧开始再一次进行俩俩比较, 将较大的元素后移, 这次比较完成后, 就会筛选出第二大的元素.

    3. 列表有n个元素, 就重复n次步骤1, 即完成了从小到大的排序.

    代码实现:

    lst = [3, 1, 5, 2, 10, 8]
    
    for ele in range(len(lst)):  # 有几个元素, 比较几次
        i = 0
        while i < len(lst) - 1:  # 由于有索引i+1, 所以i能取到倒数第二个索引即可, 即可覆盖比较到全部元素
            if lst[i] > lst[i+1]:
                lst[i], lst[i+1] = lst[i+1], lst[i]  # 值互换, 大的值右移
            i += 1
    print(lst)

    其实以上的代码就是冒泡排序算法的一种实现, 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名“冒泡排序”。

    思考:

    虽然以上代码可以实现从小到大的排序, 但观察for循环体内的实现, 每次比较都会覆盖比较到最后一个元素. 其实完成第一次比较后, 最后一个元素已经是最大的了, 下次比较没必要覆盖到最后一个元素, 下次比较可以剔除该元素. 第三次比较前, 其实已经筛选出最大的两个元素, 所以第三次比较不用覆盖到最后两个元素, 依此类推, 每次需要比较的元素不断减少. 

    每次剔除不必再次比较的元素, 关键点就在于循环时, 控制列表的最大索引即可.

    以下是修改后的代码实现:

    # 方法二
    lst = [3, 1, 5, 2, 10, 8]
    max_index = len(lst) - 1  # 最大索引
    while max_index > 0:
        for i in range(max_index):
            if lst[i] > lst[i+1]:
                lst[i], lst[i+1] = lst[i+1], lst[i]
        max_index -= 1  # 完成一次俩俩比较后, 最大索引减1, 剔除不需再进行比较的元素
    
    print(lst)

    以上就是使用冒泡排序算法对列表进行排序的个人理解.

  • 相关阅读:
    Python自动补全
    Ubuntu的Mysql指南
    Kubernetes deployed on multiple ubuntu nodes
    【iOS】更新 CocoaPods 后 Podfile 报错
    【iOS】Xcode 使用 CocoaPods 导入第三方库后没有提示
    【iOS】build diff: /../Podfile.lock: No such file or directory
    【iOS】Interface Builder 预览
    【iOS】this class is not key value coding-compliant for the key ...
    【iOS】XIB 调整视图大小
    【iOS】[[NSBundle mainBundle] loadNibNamed:nibTitle owner:self options:nil] 异常
  • 原文地址:https://www.cnblogs.com/gandoufu/p/9294586.html
Copyright © 2011-2022 走看看