题目: 有一个纯数字的无序列表, 要求对列表进行排序.
例如: 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 =0while 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 inrange(max_index):if lst[i] > lst[i+1]:
lst[i], lst[i+1] = lst[i+1], lst[i]
max_index-= 1 #完成一次俩俩比较后, 最大索引减1, 剔除不需再进行比较的元素
print(lst)
以上就是使用冒泡排序算法对列表进行排序的个人理解.