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