冒泡排序的由来和原理 — 通俗易懂版
想象你有一堆数字牌,乱七八糟地放在桌子上,你想把它们从小到大排好。你会怎么做?
1. 冒泡排序名字的由来
“冒泡”这个名字,来源于我们平时看到水里气泡往上冒的样子。
- 在排序中,最大的数字就像水里的气泡一样,会“冒”到序列的最顶端(数组的末尾)。
- 每一轮比较和交换,就像气泡往上浮动一步。
2. 冒泡排序的思路
- 从头开始,依次比较相邻的两个数字。
- 如果前面的数字比后面的数字大,就交换它们的位置。
- 这样一趟下来,最大的数字就“冒泡”到了最后面。
- 接着对剩下的数字重复这个过程,直到所有数字都排好。
3. 举个简单例子
假设你有一组数字:5, 3, 8, 4, 2
-
第一轮:
- 比较5和3,5 > 3,交换 →
3, 5, 8, 4, 2 - 比较5和8,5 < 8,不交换 →
3, 5, 8, 4, 2 - 比较8和4,8 > 4,交换 →
3, 5, 4, 8, 2 - 比较8和2,8 > 2,交换 →
3, 5, 4, 2, 8
→ 最大的8“冒泡”到了最后
- 比较5和3,5 > 3,交换 →
-
第二轮:
- 比较3和5,3 < 5,不交换 →
3, 5, 4, 2, 8 - 比较5和4,5 > 4,交换 →
3, 4, 5, 2, 8 - 比较5和2,5 > 2,交换 →
3, 4, 2, 5, 8
→ 第二大的5“冒泡”到了倒数第二个位置
- 比较3和5,3 < 5,不交换 →
-
第三轮:
- 比较3和4,3 < 4,不交换 →
3, 4, 2, 5, 8 - 比较4和2,4 > 2,交换 →
3, 2, 4, 5, 8
- 比较3和4,3 < 4,不交换 →
-
第四轮:
- 比较3和2,3 > 2,交换 →
2, 3, 4, 5, 8
- 比较3和2,3 > 2,交换 →
-
排序完成:
2, 3, 4, 5, 8
4. 为什么叫“冒泡”?
因为每一轮最大的数字都会像气泡一样,一步步“浮”到最右边(数组末尾),就像水里的气泡往上冒一样。
5. 冒泡排序的特点
- 简单易懂,适合初学者。
- 稳定排序,相同元素的相对顺序不会改变。
- 时间复杂度:最坏和平均情况是 O(n²),不适合大数据量排序。
6. 总结
冒泡排序就是通过不断比较相邻元素,把最大的元素“冒泡”到最后,重复这个过程,直到所有元素都排好。它的名字形象地描述了这个“冒泡”的过程。
下面我帮你写一段用C#实现的冒泡排序代码示例,并且模拟用扑克牌演示的过程。代码中会打印每一轮比较和交换的过程,方便你理解“冒泡”的动作,就像用扑克牌一张张比较、交换位置一样。
using System;
class BubbleSortDemo
{
// 冒泡排序方法,带演示输出
static void BubbleSort(int[] arr)
{
int n = arr.Length;
bool swapped;
for (int i = 0; i < n - 1; i++)
{
swapped = false;
Console.WriteLine($"第{i + 1}轮排序开始:");
for (int j = 0; j < n - 1 - i; j++)
{
Console.Write($" 比较 {arr[j]} 和 {arr[j + 1]}:");
if (arr[j] > arr[j + 1])
{
// 交换
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
Console.WriteLine($"交换 -> 当前数组状态:{StringifyArray(arr)}");
}
else
{
Console.WriteLine("不交换");
}
}
if (!swapped)
{
// 如果一轮下来没有交换,说明已经有序,提前结束
Console.WriteLine("没有发生交换,数组已排序完成。");
break;
}
Console.WriteLine($"第{i + 1}轮排序结束,数组状态:{StringifyArray(arr)}\n");
}
}
// 辅助方法:将数组转换成字符串,方便打印
static string StringifyArray(int[] arr)
{
return string.Join(", ", arr);
}
static void Main()
{
// 模拟扑克牌上的数字
int[] cards = { 7, 3, 5, 2, 9 };
Console.WriteLine("初始牌面:");
Console.WriteLine(StringifyArray(cards));
Console.WriteLine();
BubbleSort(cards);
Console.WriteLine("排序后的牌面:");
Console.WriteLine(StringifyArray(cards));
}
}
代码说明:
BubbleSort方法中,每一轮都会打印当前轮次开始。- 内层循环比较相邻的两个元素,打印比较的数字。
- 如果需要交换,打印交换后的数组状态,模拟你用扑克牌交换位置的动作。
- 如果一轮下来没有发生交换,说明数组已经有序,提前结束排序。
Main方法中定义了一个模拟扑克牌数字的数组,演示排序过程。
运行效果示例(部分):
初始牌面:
7, 3, 5, 2, 9
第1轮排序开始:
比较 7 和 3:交换 -> 当前数组状态:3, 7, 5, 2, 9
比较 7 和 5:交换 -> 当前数组状态:3, 5, 7, 2, 9
比较 7 和 2:交换 -> 当前数组状态:3, 5, 2, 7, 9
比较 7 和 9:不交换
第1轮排序结束,数组状态:3, 5, 2, 7, 9
第2轮排序开始:
比较 3 和 5:不交换
比较 5 和 2:交换 -> 当前数组状态:3, 2, 5, 7, 9
比较 5 和 7:不交换
第2轮排序结束,数组状态:3, 2, 5, 7, 9
第3轮排序开始:
比较 3 和 2:交换 -> 当前数组状态:2, 3, 5, 7, 9
比较 3 和 5:不交换
第3轮排序结束,数组状态:2, 3, 5, 7, 9
第4轮排序开始:
比较 2 和 3:不交换
没有发生交换,数组已排序完成。
排序后的牌面:
2, 3, 5, 7, 9
这样你就可以把这段代码当成“扑克牌冒泡排序演示”,每次比较和交换都像你用手拿牌比大小、交换位置一样,直观又形象。

本文通过生动的泡泡比喻,深入浅出地介绍了冒泡排序的工作原理。详细解释了如何通过不断交换相邻元素的位置来完成排序的过程,并给出了具体的实现代码示例。
39万+





