冒泡法
简介:
属于交换排序
两两比较大小,交换位置。如同水咕嘟咕嘟往上冒
结果分为升序和降序排列
升序
n个数从左到右,编号从0开始到n-1,索引0和1的值比较,如果索引0大,则交换两者位置,如果索引1大,则不交换。继续比较索引1和2的值,将大值放在右侧。直至n-2和n-1比较完,第一轮比较完成。第二轮从索引0比较到n-2,因为最右侧n-1位置上已经是最大值了。依此类推,每一轮都会减少最右侧的不参与比较,直至剩下最后2个数比较。
降序
和升序相反
冒泡法总结:
冒泡法需要数据一轮轮比较可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交换,继续下一轮排序
- 最差的排序情况是,初始顺序与目标顺序完全相反,遍历次数1,,n-1之和n(n-1)/2
- 最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n-1
- 时间复杂度O(n**2)
冒泡法示例:
num_list = [[1,9,8,5,6,7,4,3,2],[1,2,3,4,5,6,7,8,9]]
nums = num_list[1]
print(nums)
length = len(nums)
count_swap = 0
count = 0
for i in range(length):
for j in range(length-i-1):
count += 1
if nums[j] > nums[j+1]:
tmp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = tmp
count_swap += 1
print(nums, count_swap,count)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9] 0 36
冒泡法优化:
这里面的flag的意思是当走一遍for以后都为Flase时那就是顺序对了,直接退出
num_list = [[1,9,8,5,6,7,4,3,2],
[1,2,3,4,5,6,7,8,9],
[1,5,6,7,2,3,4,9,8]
]
nums = num_list[2]
print(nums)
length = len(nums)
count_swap = 0
count = 0
for i in range(length):
flag = False
for j in range(length-i-1):
count += 1
if nums[j] > nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
flag = True
count_swap += 1
if not flag:
break
print(nums, count_swap,count)
[1, 5, 6, 7, 2, 3, 4, 9, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9] 10 26