排序算法:冒泡排序

这里写目录标题

  • 算法的大致思想
    • 第一次迭代分析
    • 第二次迭代分析
    • 规律
      • 确定迭代次数
      • 迭代过程代码优化
  • 迭代过程实现
    • 第一次迭代
    • 第二次迭代过程
    • 最终代码

算法的大致思想

假设有一个含7个元素的随机数组arr=[77, 64, 2, 43, 7, 49, 78]

第一次迭代分析

假设我们最终的期望的排序结果是从小到大;我们就可以依次比较相邻的两个元素(使用python的索引机制,其中i表示元素的索引,初始值为0)
排序算法:冒泡排序_第1张图片

若左边元素大于右边,两者互换位置,i+1,
若左边元素小于右边元素,不做任何操作,i+1

排序算法:冒泡排序_第2张图片

将所有相邻的元素都比较一遍,共6次,(此时i的值为5,i+1的值为6,我们不希望索引值i超出(7-1)),我们称为完成了第一次迭代

第二次迭代分析

我们将i的值变为0,在第一次迭代基础上,重复第一次迭代时元素的操作内容,即比较相邻元素,然后互换位置
排序算法:冒泡排序_第3张图片

规律

从上面我们可以看到,每一次迭代都将当前数组中的最大值转移到数组的最右端(冒泡排序名称的由来),也就是说第二次迭代时不用再比较倒数第二个元素和倒数第一个元素,第三次迭代时不用再比较倒数第三个和倒数第二个元素

确定迭代次数

根据上面规律,第一次迭代后,倒数最后一个元素有序;第二次迭代后,倒数后两个元素有序,…,第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次排序结束'''        

你可能感兴趣的:(#,数据结构与算法python版,python,排序算法)