对于编程初学者来说,冒泡排序是绕不开的基础算法之一。它的逻辑简单易懂,就像水里的气泡一样,会慢慢“浮”到水面,因此得名冒泡排序。今天我们就用C#语言来实现它,一起走进算法的世界。
💡 冒泡排序的核心原理
冒泡排序的核心思想很直白:重复地走访过要排序的元素列,依次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。
- 每一轮排序都会把当前未排序部分的最大元素“冒泡”到末尾
- 经过n-1轮排序(n为元素个数),整个序列就会变得有序
- 时间复杂度为O(n²),虽然效率不算高,但胜在逻辑简单,适合入门理解排序思想
💻 C#实现冒泡排序的完整代码
using System;
namespace BubbleSortDemo
{
class Program
{
static void Main(string[] args)
{
// 待排序的数组
int[] arr = { 64, 34, 25, 12, 22, 11, 90 };
Console.WriteLine("排序前的数组:");
PrintArray(arr);
// 调用冒泡排序方法
BubbleSort(arr);
Console.WriteLine("\n排序后的数组:");
PrintArray(arr);
}
/// <summary>
/// 冒泡排序方法
/// </summary>
/// <param name="arr">待排序的数组</param>
static void BubbleSort(int[] arr)
{
int n = arr.Length;
// 外层循环:控制排序轮数,共n-1轮
for (int i = 0; i < n - 1; i++)
{
// 内层循环:比较相邻元素,每轮都会减少i次比较
for (int j = 0; j < n - i - 1; j++)
{
// 如果前一个元素大于后一个元素,交换它们的位置
if (arr[j] > arr[j + 1])
{
// 交换元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
/// <summary>
/// 打印数组方法
/// </summary>
/// <param name="arr">要打印的数组</param>
static void PrintArray(int[] arr)
{
foreach (int item in arr)
{
Console.Write(item + " ");
}
}
}
}
📝 代码逐行解析
🔹 基础结构与初始化
- 首先我们创建了一个控制台应用程序,定义了待排序的整数数组
PrintArray方法用于打印数组,方便我们查看排序前后的效果
🔹 核心排序逻辑
- 外层循环:
for (int i = 0; i < n - 1; i++)控制排序的轮数,因为n个元素只需要n-1轮就能完成排序 - 内层循环:
for (int j = 0; j < n - i - 1; j++)负责每一轮的相邻元素比较,每完成一轮,末尾的i个元素已经是有序的,不需要再比较 - 元素交换:当发现前一个元素大于后一个元素时,通过临时变量
temp完成交换
🔹 运行结果
执行程序后,你会看到这样的输出:
排序前的数组:
64 34 25 12 22 11 90
排序后的数组:
11 12 22 25 34 64 90
🚀 优化冒泡排序:提前终止与标记优化
上面的代码是最基础的冒泡排序实现,我们可以做一些优化来提升效率:
static void OptimizedBubbleSort(int[] arr)
{
int n = arr.Length;
bool swapped; // 标记是否发生了交换
for (int i = 0; i < n - 1; i++)
{
swapped = false; // 每轮开始时重置标记
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
// 交换元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true; // 标记发生了交换
}
}
// 如果这一轮没有发生交换,说明数组已经有序,可以提前终止
if (!swapped)
break;
}
}
- 增加了
swapped标记,如果某一轮没有发生任何交换,说明数组已经有序,可以提前结束排序 - 这个优化在数组接近有序时能大幅减少排序时间
🎯 初学者学习要点
- 理解交换逻辑:重点掌握相邻元素的比较与交换过程
- 跟踪排序过程:可以在代码中添加打印语句,查看每一轮排序后的数组状态
- 尝试手动模拟:拿一个小的数组,手动模拟冒泡排序的过程,加深理解
- 对比优化版本:理解优化版本如何减少不必要的比较,提升效率