冒泡法:

属于交换排序;

两两比较大小,交换位置。如同水泡咕嘟咕嘟往上冒

结果分为升序和降序排列


升序:

n个数从左至右,编号从0开始到n-1,索引0和1的值比较,如果索引0的值大,则交换两者位置,如果索引1的值大,则不交换;

继续比较索引1和2的值,将大值放在右侧。直至n-2和n-1比较完,第一轮比较完成。

第二轮从索引0比较到n-2,因为最右侧n-1位置上已经是最大值了。

依次类推,每一轮都会减少最右侧的不参与比较,直至剩下最后2个数比较。


降序:

和升序相反


代码:

num_list = [1, 4, 2, 3, 8, 7, 5, 9, 6]

length = len(num_list)

for i in range(length):
    for j in range(length - i -1):
        if num_list[j] > num_list[j + 1]:
            tmp = num_list[j]
            num_list[j] = num_list[j + 1]
            num_list[j + 1] = tmp
print(num_list)

优化:

num_list = [1, 4, 2, 3, 8, 7, 5, 9, 6]

length = len(num_list)

for i in range(length):
    flag = False
    for j in range(length - i -1):
        if num_list[j] > num_list[j + 1]:
            tmp = num_list[j]
            num_list[j] = num_list[j + 1]
            num_list[j + 1] = tmp
            flag = True
    if not flag:
        break
print(num_list)

总结:

冒泡法需要数据一轮轮的比较;

可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交

换,继续下一轮排序;

最差的情况是,初始顺序与目标顺序完全相反,遍历次数1...n-1之和n(n-1)/2

最好的情况是,初始顺序与目标顺序完全相同,遍历次数n-1;

时间复杂度o(n**2)