冒泡法:
属于交换排序;
两两比较大小,交换位置。如同水泡咕嘟咕嘟往上冒
结果分为升序和降序排列
升序:
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)