Python 实现的冒泡排序

冒泡排序

Bubble Sort 是一种算法,用于将数组从最低值排序到最高值。


{{ msgDone }}

运行模拟,查看 Bubble Sort 算法对值数组进行排序时的样子。数组中的每个值都由一列表示。

'Bubble' 一词来源于此算法的工作方式,它使最高值“冒泡”。

工作原理:

  1. 逐个遍历数组。
  2. 对于每个值,将其与下一个值进行比较。
  3. 如果该值高于下一个值,则交换这两个值,使最高值排在最后。
  4. 遍历数组的次数与数组中的值数量相同。

手动运行示例

在编程语言中实现 Bubble Sort 算法之前,让我们先手动对一个短数组仅运行一次,以了解其原理。

第 1 步:从未排序数组开始。

[7, 12, 9, 11, 3]

第 2 步:查看前两个值。最低值是否排在前面?是的,因此无需交换它们。

[7, 12, 9, 11, 3]

第 3 步:向前移动一步,查看值 12 和 9。最低值是否排在前面?不是。

[7, 12, 9, 11, 3]

第 4 步:因此,我们需要交换它们,使 9 排在前面。

[7, 9, 12, 11, 3]

第 5 步:再向前移动一步,查看值 12 和 11。

[7, 9, 12, 11, 3]

第 6 步:我们必须交换它们,使 11 排在 12 前面。

[7, 9, 11, 12, 3]

第 7 步:查看值 12 和 3,我们需要交换它们吗?是的。

[7, 9, 11, 12, 3]

第 8 步:交换值 12 和 3,使 3 排在前面。

[7, 9, 11, 3, 12]

重复上述步骤,直到无需再进行交换,即可得到一个已排序数组:

{{ msgDone }}
[
{{ x.dieNmbr }}
]

在 Python 中实现冒泡排序

要在 Python 中实现 Bubble Sort 算法,我们需要:

  1. 待排序的数组。
  2. 内部循环,用于遍历数组并在第一个值高于下一个值时交换它们。每次运行时,此循环必须遍历的值数量减少一个。
  3. 外部循环,用于控制内部循环的运行次数。对于包含 n 个值的数组,此外部循环必须运行 n-1 次。

生成的代码如下所示:

实例

在 Python 中创建 Bubble Sort 算法:

mylist = [64, 34, 25, 12, 22, 11, 90, 5]

n = len(mylist)
for i in range(n-1):
  for j in range(n-i-1):
    if mylist[j] > mylist[j+1]:
      mylist[j], mylist[j+1] = mylist[j+1], mylist[j]

print(mylist)

亲自试一试

冒泡排序的改进

Bubble Sort 算法还可以进一步改进。

想象一下,如果数组已经接近排序完成,最低值位于数组开头,例如:

mylist = [7, 3, 9, 12, 11]

在这种情况下,数组在第一次运行后就会排序完成,但 Bubble Sort 算法将继续运行,而不交换任何元素,这是不必要的。

如果算法遍历数组一次而未交换任何值,则数组必定已排序完成,我们可以像这样停止算法:

实例

改进后的 Bubble Sort 算法:

mylist = [7, 3, 9, 12, 11]

n = len(mylist)
for i in range(n-1):
  swapped = False
  for j in range(n-i-1):
    if mylist[j] > mylist[j+1]:
      mylist[j], mylist[j+1] = mylist[j+1], mylist[j]
      swapped = True
  if not swapped:
    break

print(mylist)

亲自试一试

冒泡排序的时间复杂度

Bubble Sort 算法遍历数组中的每个值,并将其与相邻值进行比较。因此,对于包含 \(n\) 个值的数组,一次循环中必须进行 \(n\) 次这样的比较。

然后,数组会再次被遍历 \(n\) 次。

这意味着总共需要进行 \(n \cdot n\) 次比较,因此 Bubble Sort 的时间复杂度为:\( O(n^2) \)。

描述 Bubble Sort 时间复杂度的图形如下所示:

Bubble Sort 时间复杂度

如你所见,当数组大小增加时,运行时间会迅速增加。

幸运的是,存在比 Bubble Sort 更快的排序算法,例如快速排序,我们将在后面进行介绍。