问题
排序 [30, 24, 5, 58, 18, 36, 12, 42, 39]
冒泡排序
冒泡排序通过多次遍历待排序列表,每次比较相邻两个元素,如果顺序错误就将它们交换过来,重复进行直到没有需要交换的元素,排序完成。
图解
-
第一轮排序:遍历全部元素,依次比较相邻元素,直到将最大的元素交换到最后一位。
-
第二轮排序,遍历待排序元素,依次比较相邻元素,将最大的元素交换到待排序列表的最后一位。
-
继续遍历直到所有元素被交换到正确位置时结束。
代码
py
def bubble_sort(nums):
n = len(nums)
for i in range(n -1): # 外循环
for j in range(n-1-i): # 内循环
if nums[j] > nums[j+1]: # 顺序错误时交换
nums[j], nums[j+1] = nums[j+1], nums[j]
return nums
时间复杂度
冒泡排序的时间复杂度为 O(n2)
算法优化
增加一个标志位 flag,若在某轮内循环中没有进行任何交换操作,表示数组已经完成排序,可以直接返回结果。
py
def bubble_sort(nums):
n = len(nums)
for i in range(n -1): # 外循环
flag = False
for j in range(n-1-i): # 内循环
if nums[j] > nums[j+1]: # 顺序错误时交换
nums[j], nums[j+1] = nums[j+1], nums[j]
flag = True
if not flag: break
return nums