您现在的位置是:首页 >学无止境 >C#排序算法大揭秘:数据世界的神奇整理术网站首页学无止境
C#排序算法大揭秘:数据世界的神奇整理术
排序算法大揭秘:数据世界的神奇整理术
在数据的奇妙世界里,排序算法就像是神奇的整理大师,把一堆杂乱无章的数据变得井井有条。想象一下,你的书架上堆满了各种书籍,找一本书时像大海捞针,可要是按照类别或作者排好序,找书就易如反掌啦!排序算法在编程里也是如此,能让数据高效地被处理和查找。今天,就带大家认识几位 “排序界的明星”,看看它们是怎么施展魔法的。

冒泡排序:勤劳的 “气泡交换员”
冒泡排序就像一个勤劳的小工人,一趟趟地检查数据,把大的数字(或小的数字,取决于排序顺序)像气泡一样 “冒” 到数组末尾。它的操作简单又有趣,每次比较相邻的两个元素,如果顺序不对就交换位置。
比如,有一组数字 [5, 3, 8, 2, 9],冒泡排序开始工作啦!第一轮,它先比较 5 和 3,发现 5 比 3 大,就把它们交换,数组变成 [3, 5, 8, 2, 9];接着比较 5 和 8,顺序正确,不交换;再比较 8 和 2,交换后变成 [3, 5, 2, 8, 9];最后比较 8 和 9,不交换。第一轮结束,最大的 9 就 “冒” 到了末尾。然后继续下一轮,直到所有数字都排好序。
用 C# 代码实现冒泡排序如下:
using System;
class BubbleSort
{
public static void Sort(int[] arr)
{
int n = arr.Length;
for (int i = 0; i < n - 1; 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;
}
}
}
}
}
可以这样调用这个方法:
class Program
{
static void Main()
{
int[] numbers = { 5, 3, 8, 2, 9 };
BubbleSort.Sort(numbers);
Console.WriteLine("排序后的数组:");
foreach (int num in numbers)
{
Console.Write(num + " ");
}
}
}
冒泡排序简单易懂,但它的效率有点低,时间复杂度是 ,就像一个做事慢吞吞的人,数据量大的时候要花很长时间才能完成任务。
快速排序:聪明的 “分治策略家”
快速排序就像一个聪明的指挥官,采用分治策略来高效地完成排序任务。它先从数组中选一个基准值,然后把数组分成两部分,左边部分的元素都小于基准值,右边部分的元素都大于基准值。接着,对左右两部分分别递归地进行快速排序,直到整个数组有序。
比如,还是 [5, 3, 8, 2, 9] 这组数字,假设选 5 作为基准值。它开始把小于 5 的数字放在左边,大于 5 的数字放在右边,数组变成 [3, 2, 5, 8, 9]。然后对 [3, 2] 和 [8, 9] 分别进行快速排序,最终得到有序数组 [2, 3, 5, 8, 9]。
C# 代码实现快速排序:
using System;
class QuickSort
{
public static void Sort(int[] arr, int low, int high)
{
if (low < high)
{
int pi = Partition(arr, low, high);
Sort(arr, low, pi - 1);
Sort(arr, pi + 1, high);
}
}
private static int Partition(int[] arr, int low, int high)
{
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++)
{
if (arr[j] < pivot)
{
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp1 = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp1;
return i + 1;
}
}
调用方式如下:
class Program
{
static void Main()
{
int[] numbers = { 5, 3, 8, 2, 9 };
QuickSort.Sort(numbers, 0, numbers.Length - 1);
Console.WriteLine("排序后的数组:");
foreach (int num in numbers)
{
Console.Write(num + " ");
}
}
}
快速排序平均时间复杂度是 ,效率很高,就像一个做事又快又有条理的能手,是很多实际应用中的首选排序算法。不过,在最坏情况下,比如数组已经有序时,它的时间复杂度会退化为 。
归并排序:严谨的 “合并大师”
归并排序是个严谨的大师,它把数组不断地分成两半,直到每个子数组只有一个元素,然后再把这些子数组合并起来,合并的过程中保证合并后的数组是有序的。
比如,对于 [5, 3, 8, 2, 9],先分成 [5, 3] 和 [8, 2, 9],[5, 3] 再分成 [5] 和 [3],[8, 2, 9] 分成 [8] 和 [2, 9],[2, 9] 分成 [2] 和 [9]。然后开始合并,[5] 和 [3] 合并成 [3, 5],[8] 和 [2, 9] 合并时,先把 [2, 9] 分成 [2] 和 [9] 再合并成 [2, 9],最后 [3, 5] 和 [2, 9] 合并成 [2, 3, 5, 8, 9]。
C# 实现归并排序的代码如下:
using System;
class MergeSort
{
public static void Sort(int[] arr)
{
if (arr.Length > 1)
{
int mid = arr.Length / 2;
int[] left = new int[mid];
int[] right = new int[arr.Length - mid];
Array.Copy(arr, 0, left, 0, mid);
Array.Copy(arr, mid, right, 0, arr.Length - mid);
Sort(left);
Sort(right);
Merge(arr, left, right);
}
}
private static void Merge(int[] arr, int[] left, int[] right)
{
int i = 0, j = 0, k = 0;
while (i < left.Length && j < right.Length)
{
if (left[i] < right[j])
{
arr[k] = left[i];
i++;
}
else
{
arr[k] = right[j];
j++;
}
k++;
}
while (i < left.Length)
{
arr[k] = left[i];
i++;
k++;
}
while (j < right.Length)
{
arr[k] = right[j];
j++;
k++;
}
}
}
调用代码:
解释
class Program { static void Main() { int[] numbers = { 5, 3, 8, 2, 9 }; MergeSort.Sort(numbers); Console.WriteLine("排序后的数组:"); foreach (int num in numbers) { Console.Write(num + " "); } } }
归并排序的时间复杂度稳定在 ,无论数组初始状态如何,它都能稳定发挥。不过,它需要额外的空间来存储临时数组,就像一个需要大仓库来整理货物的商家。
总结
冒泡排序简单但有点 “慢热”,适合小数据量的排序;快速排序聪明高效,是处理大数据量的好帮手,但在最坏情况下会 “掉链子”;归并排序稳定可靠,不管数据怎么 “捣乱”,它都能有序处理,就是稍微有点 “占空间”。了解这些排序算法的特点和原理,在编程时就能根据实际情况选择最合适的 “数据整理大师”,让程序高效运行!下次遇到排序问题,你知道该选谁了吧?





QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
U8W/U8W-Mini使用与常见问题解决
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结