假设有一个含7个元素的随机数组arr=[77, 64, 2, 43, 7, 49, 78]
假设我们最终的期望的排序结果是从小到大;我们就可以依次比较相邻的两个元素(使用python的索引机制,其中i表示元素的索引,初始值为0)
若左边元素大于右边,两者互换位置,i+1,
若左边元素小于右边元素,不做任何操作,i+1
将所有相邻的元素都比较一遍,共6次,(此时i的值为5,i+1的值为6,我们不希望索引值i超出(7-1)),我们称为完成了第一次迭代
我们将i的值变为0,在第一次迭代基础上,重复第一次迭代时元素的操作内容,即比较相邻元素,然后互换位置
从上面我们可以看到,每一次迭代都将当前数组中的最大值转移到数组的最右端(冒泡排序名称的由来),也就是说第二次迭代时不用再比较倒数第二个元素和倒数第一个元素,第三次迭代时不用再比较倒数第三个和倒数第二个元素
根据上面规律,第一次迭代后,倒数最后一个元素有序;第二次迭代后,倒数后两个元素有序,…,第n-1次迭代后,倒数后n-1个元素有序,排序完成,共完成(n-1)次排序
根据上面规律,我们将n次迭代过程使用for循环表示,并且第二次迭代,i+1不必等于6(最后一个元素),第三次迭代,i+1不必等于5(倒数第二个元素),…,第n-1次迭代,i+1不必等于1(倒数第n-1个元素)
def b_sort(arr):
for i in range(len(arr)-1):
if arr[i]>arr[i+1]:
arr[i],arr[i+1]=arr[i+1],arr[i]
print(arr)
print('第1次排序结束')
b_sort(arr)
'''
[64, 77, 2, 43, 7, 49, 78]
[64, 2, 77, 43, 7, 49, 78]
[64, 2, 43, 77, 7, 49, 78]
[64, 2, 43, 7, 77, 49, 78]
[64, 2, 43, 7, 49, 77, 78]
[64, 2, 43, 7, 49, 77, 78]
第1次迭代结束'''
代码的运行结果与我们分析的结果相同,但这还达不到我们排序的目的
def b_sort(arr):
# 第一次
for i in range(len(arr)-1):
if arr[i]>arr[i+1]:
arr[i],arr[i+1]=arr[i+1],arr[i]
print(arr)
# 第二次
for i in range(len(arr)-1):
if arr[i]>arr[i+1]:
arr[i],arr[i+1]=arr[i+1],arr[i]
print(arr)
'''
'''
def b_sort(arr):
for j in range(len(arr)-1):
for i in range(len(arr)-1-j):
if arr[i]>arr[i+1]:
arr[i],arr[i+1]=arr[i+1],arr[i]
print(arr)
print(f'第{j+1}次排序结束')
'''
[64, 77, 2, 43, 7, 49, 78]
[64, 2, 77, 43, 7, 49, 78]
[64, 2, 43, 77, 7, 49, 78]
[64, 2, 43, 7, 77, 49, 78]
[64, 2, 43, 7, 49, 77, 78]
[64, 2, 43, 7, 49, 77, 78]
第1次排序结束
[2, 64, 43, 7, 49, 77, 78]
[2, 43, 64, 7, 49, 77, 78]
[2, 43, 7, 64, 49, 77, 78]
[2, 43, 7, 49, 64, 77, 78]
[2, 43, 7, 49, 64, 77, 78]
第2次排序结束
[2, 43, 7, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
第3次排序结束
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
第4次排序结束
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
第5次排序结束
[2, 7, 43, 49, 64, 77, 78]
第6次排序结束'''