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)

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

原文地址:https://www.cnblogs.com/gandoufu/p/9294586.html