1 概述
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小或越大的元素会经由交换慢慢“浮”出
2 算法流程
- 相邻元素比较,升序排列则较大的数放后面,降序排列则较小的数放后面
- 完成一次遍历就能确定出所有未排序元素的最大值或最小值,放在最后,是为冒泡
- 算法通过嵌套的两层循环完成所有元素的冒泡
(1)第1次遍历前n-1个数(遍历的数和其下一个相邻数比较,所以遍历次数少1),冒泡最大或最小的数
(2)第2次遍历前n-2个数(第1步确定的最大/最小的数不再需要比较,所以遍历次数比第一次遍历少1),冒泡第2大/小的数
(3)第3次遍历前n-3个数,冒泡第3大/小的数
……
3 代码/Python
def BubbleSort(nums):
n = len(nums)
# 第一层循环,遍历前n-1个数
for i in range(n-1):
# 第二层循环,遍历前n-i-1个数
for j in range(n-i-1):
# 相邻数比较,大的放后面
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
return nums
# 算法调用
import random
nums = [random.randint(0,100) for i in range(10)]
print('随机生成10个数字:', nums)
print('排序后输出结果为:', BubbleSort(nums))
4 算法解释
- 冒泡算法是典型的比较排序法,思路比较简单
- 时间复杂度:采用两层循环,所以时间复杂度为 O ( n 2 ) O(n^2) O(n2);最好情况是遍历一次,而没有进行任何交换,说明原本的数列就是有序的,因此最好情况的时间复杂度为 O ( n ) O(n) O(n);最坏情况就是每次遍历都需要交换,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
- 空间复杂度:由于只是进行交换操作,不额外开辟内存,所以空间复杂度是 O ( 1 ) O(1) O(1)
- 稳定性:比较相邻元素过程中,相等的元素不会交换,相对位置也不会发生变化,所以算法是稳定的