冒泡法
-
冒泡法
- 属于交换排序;
- 两两比较大小,交换位置,如同冒泡,故称冒泡排序;
- 结果分为升序和降序;
-
升序
- n个数,从左到右,依次两两比较,按双方比较结果决定是否交换位置
- 第一轮从0到n-1, 第二轮从0到n-2,每轮比较都产生一个该轮比较的最大值,并将其置于最右侧;
-
降序
- 和升序相反;
-
冒泡排序的实现
num_list = [2,4,5,6,7,1,3]
length = len(num_list)
count_swap = 0
count = 0
for i in range(length):
flag = False #增强,实现对有序序列的提前退出,当次内层循环结束后,一轮比较下来没有产生交换,判断已经有序,则退出排序
for j in range(length - i - 1):
count += 1 #遍历次数
if num_list[j] > num_list[j + 1]:
num_list[j], num_list[j + 1] = num_list[j + 1], num_list[j]
flag = True
count_swap += 1 #交换次数
if not flag:
break
print(num_list, count, count_swap)
- 总结
- 冒泡法需要一轮轮比较
- 可以通过设置一个标记判断是否发生了交换,没有则结束,有则进入下一轮排序
- 最差的情况,初始顺序与目标顺序完全相反,遍历次数1,…,n-1之和n(n-1)/2
- 最好的情况,初始顺序与目标顺序完全相同,遍历次数n-1
- 时间复杂度O(n**2)