冒泡排序算法 (带 Python/Java/C/C++ 程序)

2025 年 5 月 7 日 | 阅读 10 分钟

冒泡排序算法是计算机科学中最简单的排序算法之一。它反复遍历列表,比较相邻的元素,并在顺序错误时交换它们。这个过程会一直持续到列表被排序。它的名字来源于小元素如何“冒泡”到列表的顶部。它不适用于大型数据集。

冒泡排序主要用于:

  • 不关心复杂度
  • 倾向于简单短小的代码

以下是分步解释:

  • 比较相邻元素:从第一个元素开始。将其与下一个元素进行比较。
  • 必要时交换:如果当前元素大于下一个元素,则交换它们。
  • 对所有对重复:对列表中的所有相邻元素执行此操作。第一次遍历后,最大的元素将“冒泡”到其正确位置。
  • 忽略最后已排序的元素:对剩余未排序的元素重复此过程,忽略最后已排序的元素。
  • 在没有发生交换时停止:如果在一次完整的遍历中没有发生元素交换,则列表已排序。

算法

冒泡排序的步骤

步骤 1:比较输入数组的前两个元素。

步骤 2:如果第一个元素大于第二个元素,则交换它们;否则,不需要交换。

步骤 3:根据步骤 2,对输入数组的下一对元素(第二个和第三个元素)进行比较和交换,即如果第二个元素大于第三个元素,则进行交换;否则,不进行交换。

步骤 4:继续此过程直到到达输入数组的末尾。此时,最大的元素将“冒泡”到列表的末尾。

步骤 5:重复步骤 1 到 4,但不包括最后一个元素,因为它已经到达其正确位置。

冒泡排序算法的工作原理

我们已将以下数组作为输入数组。

Bubble sort Algorithm

第一次遍历

比较前两个元素。我们看到第一个元素小于第二个元素。因此,不需要交换。

Bubble sort Algorithm

之后,比较第二个元素和第三个元素。观察到第二个元素大于第三个元素。因此,交换元素 16 和 11。

Bubble sort Algorithm

交换后,比较第三个元素和第四个元素。观察到第三个元素大于第四个元素。因此,交换元素 16 和 13。

Bubble sort Algorithm

交换后,比较第四个元素和第五个元素。我们看到第四个元素大于第五个元素。因此,交换元素 16 和 14。

Bubble sort Algorithm

此时,数组中最大的元素已在已排序数组的正确位置(末尾)。

Bubble sort Algorithm

再次比较前两个元素。我们看到第一个元素大于第二个元素。因此,交换元素 15 和 11。

第二次遍历

Bubble sort Algorithm

之后,比较第二个元素和第三个元素。观察到第二个元素大于第三个元素。因此,交换元素 15 和 13。

Bubble sort Algorithm

交换后,比较第三个元素和第四个元素。观察到第三个元素大于第四个元素。因此,交换元素 15 和 14。

Bubble sort Algorithm

此时,我们已将两个元素放在已排序数组的正确位置。这两个元素是数组中最大和第二大的元素。

Bubble sort Algorithm

第三次遍历

再次比较前两个元素。我们看到第一个元素小于第二个元素。因此,不需要交换。

Bubble sort Algorithm

之后,比较第二个元素和第三个元素。观察到第二个元素小于第三个元素。因此,不需要交换。

Bubble sort Algorithm

由于没有进行交换,因此无需进一步检查,因为数组已排序。

Bubble sort Algorithm

Python/Java/C/C++/C# 中的冒泡排序实现

Python 程序

立即执行

Java 程序

编译并运行

C++ 程序

编译并运行

C 语言程序

编译并运行

C# 程序

编译并运行

输出

Before sorting array elements are: 
15 16 11 13 14
After sorting array elements are: 
11 13 14 15 16

复杂度分析

让我们看看冒泡排序在最好、平均和最坏情况下的时间和空间复杂度。

时间复杂度

最好情况复杂度:当不需要排序时,即数组已排序。冒泡排序的最好情况时间复杂度为O(n)

平均情况复杂度:当数组元素顺序混乱时,即既不升序也不降序。冒泡排序的平均情况时间复杂度为O(n2)

最坏情况复杂度:当数组元素需要按反序排序时。这意味着需要按升序对数组元素进行排序,但其元素是降序的。冒泡排序的最坏情况时间复杂度为O(n2)

情况时间复杂度
最佳情况O(n)
平均情况O(n2)
最坏情况O(n2)

空间复杂度

冒泡排序的空间复杂度为 O(1)。这是因为在冒泡排序中,需要一个额外的变量来进行交换。

冒泡排序的应用

  • 教学工具:冒泡排序是一种非常简单的算法。因此,它适合初学者学习排序的基础知识。
  • 近似排序的数据:当数据基本排序时,冒泡排序的表现很好,因为它可以快速发现并修复小的错位。

冒泡排序的优点

  • 易于实现和理解。
  • 它不需要任何额外的内存空间。
  • 它是一种稳定的排序算法。这意味着在排序的输出中,具有相同键值的元素会保持它们的相对顺序。

冒泡排序的缺点

  • 由于其时间复杂度为 O(n2),冒泡排序在大型数据集上速度很慢。
  • 冒泡排序的实际应用很少或没有。它通常用于学术界来教授各种排序方法。

结论

冒泡排序算法是一种可靠且易于理解的排序算法。它通过重复比较和交换相邻的元素,直到整个数组被排序。

关于冒泡排序算法的选择题练习

问题 1:优化后的冒泡排序与传统形式相比有何不同?

  1. 它使用一种独特的排序工具,可以减少所需的比较次数。
  2. 它跟踪交换次数,如果一次迭代中不再需要交换,则提前终止。
  3. 它使用多线程并行排序。
  4. 它在每次遍历中仅排序一半数组以提高效率。
 

答案:B

解释:在优化后的冒泡排序中,使用一个名为 `swapped` 的变量来跟踪在遍历数组期间是否进行了任何交换。如果没有进行交换,则表示数组已排序,算法可以提前终止,从而提高效率。


问题 2:以下哪项会导致出现冒泡排序的最坏情况时间复杂度?

  1. 输入数组已按升序排序。
  2. 输入数组按降序排序。
  3. 输入数组包含所有相同的元素。
  4. 输入数组只有一个元素放错了位置。
 

答案:B

解释:冒泡排序的最坏情况时间复杂度 O(n2) 出现在输入数组按反序排序时。在这种情况下,每个元素都必须在每次遍历中进行比较和交换,从而导致最多的操作。


问题 3:在对一个不需要交换任何元素的数组进行冒泡排序的“第二次遍历”期间会发生什么?

  1. 算法将立即终止。
  2. 算法将继续运行所有剩余的遍历,而不会对数组进行任何更改。
  3. 算法将进行一次额外的遍历以确保数组已排序。
  4. 算法将随机交换元素直到数组末尾。
 

答案:A

解释:在优化的冒泡排序中,如果在第一次遍历期间没有交换任何元素,则 `swapped` 变量将保持为 `false`,从而导致算法立即终止。这表明数组已排序,不需要进一步的遍历。


问题 4:冒泡排序不适用于大型数据集的主要原因是什么?

  1. 冒泡排序相对于输入数组的大小需要额外的空间。
  2. 冒泡排序的平均和最坏情况时间复杂度均为 O(n2),这对于大型数据集来说效率低下。
  3. 冒泡排序只适用于数字数据,而不适用于其他数据类型。
  4. 冒泡排序只能按升序对数组进行排序。
 

答案:B

解释:冒泡排序在平均和最坏情况下的时间复杂度均为 O(n2),这使得它在对大型数据集进行排序时效率低下。这种二次时间复杂度导致随着数据集大小的增加,操作次数显着增加。


问题 5:以下关于冒泡排序的哪个陈述是正确的?

  1. 冒泡排序是一种基于比较的算法,其最坏情况时间复杂度为 O(n)。
  2. 冒泡排序是一种选择排序,其最好情况时间复杂度为 O(n log n)。
  3. 冒泡排序是一种插入排序,其平均情况时间复杂度为 O(n2)。
  4. 冒泡排序是一种基于比较的算法,其最坏情况时间复杂度为 O(n2)。
 

答案:D

解释:冒泡排序是一种基于比较的排序算法。它的最坏情况时间复杂度为 O(n2),因为在最坏的情况下,每个元素都需要与每个其他元素进行比较,这会导致二次数量的比较和交换。


下一个主题插入排序算法