冒泡排序 是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,即数列已经排序完成。
具体步骤如下:
比较相邻的元素,如果前一个比后一个大(升序),就交换这两个元素的位置。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
对于序列[4, 3, 8,1]将其升序排序,冒泡排序的过程是这样的:
第一轮:(4,3), (4,8), (8,1),得到[3, 4, 1, 8]
第二轮:(3,4), (4,1),得到[3, 1, 4, 8]
第三轮:(3,1), (3,4),得到[1, 3, 4, 8]
第四轮:没有进行交换,序列保持不变
冒泡排序的时间复杂度较高,为O(n^2),不适用于大规模数据的排序。
Python代码实现
def bubble_sort(li: list) -> list:
"""冒泡排序 升序"""
for i in range(len(li) - 1): # 决定遍历多少趟, n-1趟
flag = False # 标识 是否进行元素交换,未发生交换则表明数组已然是有序得了,后续就不在执行剩余的趟
for j in range(len(li) - i - 1): # 相邻两元素的索引,不大于n-1,且为无序区长度-1
if li[j] > li[j + 1]:
li[j], li[j + 1] = li[j + 1], li[j]
flag = True
if not flag:
return
print('第' + str(i) + '趟:', li)
if __name__ == '__main__':
# nums = [1, 5, 8, 9, 10, 4, 6, 13, 0] # 执行全部n-1趟
nums = [0, 1, 2, 3, 6, 5] # 执行第0趟,数组已经有序,便不再进行后续趟数的判断元素大小以及交换
print('原数组:', nums)
bubble_sort(nums)
# 输出结果
原数组: [0, 1, 2, 3, 6, 5]
第0趟: [0, 1, 2, 3, 5, 6]
原数组: [1, 5, 8, 9, 10, 4, 6, 13, 0]
第0趟: [1, 5, 8, 9, 4, 6, 10, 0, 13]
第1趟: [1, 5, 8, 4, 6, 9, 0, 10, 13]
第2趟: [1, 5, 4, 6, 8, 0, 9, 10, 13]
第3趟: [1, 4, 5, 6, 0, 8, 9, 10, 13]
第4趟: [1, 4, 5, 0, 6, 8, 9, 10, 13]
第5趟: [1, 4, 0, 5, 6, 8, 9, 10, 13]
第6趟: [1, 0, 4, 5, 6, 8, 9, 10, 13]
第7趟: [0, 1, 4, 5, 6, 8, 9, 10, 13]