C#数据结构与算法系列(十八):冒泡排序算法(BubbleSort)
1.介绍
冒泡排序的基本思想就是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底的气泡一样逐渐向上冒泡。
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下
来没有进行过交换,就说明序列有序,因此要在排序过程中设置
一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)
时间复杂度:O(n^2)
2.图解
3.代码实现
using System; namespace DataStructure { public class BubbleSort { /// <summary> /// 测试 /// </summary> public static void Test() { int[] arr = { 3, 9, -1, 10, 20 }; Console.WriteLine("排序的数组:" + ArrayToString(arr)); Console.WriteLine("\n优化后的数组排序"); Sort(arr); Console.WriteLine("\n优化前的数组排序"); arr = new int[] { 3, 9, -1, 10, 20 }; for (int i = 0; i < arr.Length - 1 - 0; i++) { int temp = 0; if (arr[i] > arr[i + 1]) { temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.Console.WriteLine("\n第一次排序的结果:" + ArrayToString(arr)); for (int i = 0; i < arr.Length - 1 - 1; i++) { int temp = 0; if (arr[i] > arr[i + 1]) { temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.Console.WriteLine("\n第二次排序的结果:" + ArrayToString(arr)); for (int i = 0; i < arr.Length - 1 - 2; i++) { int temp = 0; if (arr[i] > arr[i + 1]) { temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.Console.WriteLine("\n第三次排序的结果:" + ArrayToString(arr)); for (int i = 0; i < arr.Length - 1 - 3; i++) { int temp = 0; if (arr[i] > arr[i + 1]) { temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.Console.WriteLine("\n第四次排序的结果:" + ArrayToString(arr)); } /// <summary> /// 将数组转换成String /// </summary> /// <param name="arr"></param> /// <returns></returns> public static string ArrayToString(int[] arr) { string result = ""; for (int i = 0; i < arr.Length; i++) { result += arr[i] + ","; } return result; } /// <summary> /// 排序算法优化并封装 /// </summary> /// <param name="arr"></param> public static void Sort(int[] arr) { //标识标量,表示是否被交换过 bool flag = false; //临时变量 int temp = 0; //要排序的次数,arr.Length-1 for (int i = 1; i < arr.Length; i++) { //第几次排序 for (int j = 0; j < arr.Length - i; j++) { //如果前面的数大于后面的数,则交换 if (arr[j] > arr[j + 1]) { flag = true; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } //每次排序的结果 System.Console.WriteLine("\n第" + i + "次排序的结果:" + ArrayToString(arr)); if (!flag) break; //在一趟排序中,一次交换都没有发生过 else flag = false; //重置flag进行下次判断 } } } }
4.结果图
微信:17873041739
分类:
DataStructure
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?