假设有一个数组arr = [6, 4, 3, 1, 2]需要按从小到大的顺序排序,用眼睛一眼就看出来怎么排了,用程序该如何实现呢
冒泡排序的规则:
1 相邻两个数比较,若前面的数大小后面的数,交换位置
2 再按1的规则进行排序,直到所有数都排好序为止
使用程序来模拟前面的规则,为了便于理解,我们先用数据来实际模拟一遍
原始数据集:6, 4, 3, 1, 2
第一轮结果:4, 3, 1, 2, 6
第二轮结果:3, 1, 2, 4, 6
第三轮结果:1, 2, 3, 4, 6
第四轮结果:1, 2, 3, 4, 6
详细说明
第一轮排序:6>4交换位置,变成4,6, 6>3交换位置变成3, 6, 6>1,交换位置变成1, 6, 6>2,交换位置变成2, 6, 第一轮排序完成,最终最大数6稳定在最后位置
第二轮排序:4>3交换位置,变成3,4,4>1交换位置变成1,4,4>2,交换位置变成2,4,最终剩下的最大数4稳定在倒数第二位置
第三轮排序:3>1交换位置,变成1, 3, 3>2交换位置变成2,3,最终剩下的最大数3稳定在倒数第三位置
第四轮排序:1<2,不变,2稳定在倒数第四位置
第五轮排序:只剩下1,1稳定在倒数第五位置
程序模拟:
我们可以用程序模拟每一轮的排序过程:
def sort_once(arr, index):
for i in range(len(arr)-1-index):
print(arr[i], arr[i+1])
if arr[i] > arr[i+1]:
arr[i], arr[i+1] = exchange(arr[i], arr[i+1])
print(arr)
说明: 可以每一轮都将相邻的数进行比较,则对于5个数的排序,应该是5-1次比较,第一轮是比较4次,第二轮则是3次,看起来是每多一轮就多减1,我们可以设置个参数index,每次多出来的就减index即可
每一轮排序完成,我们可以把5轮都做一下:
for i in range(len(arr)):
sort_once(arr, i)
程序优化
观察当一轮排序中没有发生交换数据的时候,此时所有的数已经排序好了。