C# 选择排序
最后修改于 2025 年 3 月 9 日
本文探讨了 C# 中的选择排序算法。我们将定义它,展示数字和字符串排序的示例,并将其与快速排序进行比较。
算法是解决问题或完成任务的清晰、循序渐进的过程。 它是编程中的核心概念,指导代码如何工作。
排序将数据组织成特定的顺序,例如升序或降序。 它是计算机科学中用于管理和访问数据的关键技能。
常用排序算法
以下是一些常用的排序算法
- 选择排序
- 气泡排序
- 插入排序
- 归并排序
- 快速排序
- 堆排序
选择排序算法
选择排序算法重复扫描列表的未排序部分,以找到最小(或最大)的元素。 然后,它将此元素与第一个未排序的位置交换。
重复此过程,直到列表完全排序。 它易于理解和实现,但对于大型数据集来说不是最快的。
选择排序示例
下面是选择排序的 C# 实现。 它适用于数组,并且可以按升序或降序排序。
SelectionSort.cs
// SelectionSort.cs T[] SelectionSort<T>(T[] arr, bool ascending) { int n = arr.Length; for (int i = 0; i < n; i++) { int idx = i; for (int j = i + 1; j < n; j++) { int comparison = Comparer<T>.Default.Compare(arr[j], arr[idx]); if ((ascending && comparison < 0) || (!ascending && comparison > 0)) { idx = j; } } if (idx != i) { (arr[i], arr[idx]) = (arr[idx], arr[i]); } } return arr; } int[] numbers = [64, 25, 12, 22, 11]; string[] words = ["apple", "banana", "kiwi", "cherry"]; Console.WriteLine("Ascending: " + string.Join(" ", SelectionSort(numbers, true))); Console.WriteLine("Descending: " + string.Join(" ", SelectionSort(numbers, false))); Console.WriteLine("Ascending: " + string.Join(" ", SelectionSort(words, true))); Console.WriteLine("Descending: " + string.Join(" ", SelectionSort(words, false)));
SelectionSort
方法接受一个类型为 T
的数组和一个用于排序方向的布尔值。 它使用 Comparer
来处理不同的数据类型,例如整数和字符串。
选择排序与快速排序的比较
选择排序很容易编写代码,但对于大型列表来说速度很慢,时间复杂度为 O(n²)。 快速排序使用分而治之的策略,平均速度更快,为 O(n log n)。 让我们对它们进行基准测试。
Benchmark.cs
// Benchmark.cs using System.Diagnostics; int[] SelectionSort(int[] arr) { int n = arr.Length; for (int i = 0; i < n; i++) { int idx = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[idx]) { idx = j; } } if (idx != i) { (arr[i], arr[idx]) = (arr[idx], arr[i]); } } return arr; } int[] QuickSort(int[] arr) { if (arr.Length <= 1) { return arr; } int pivot = arr[arr.Length / 2]; var left = new List<int>(); var middle = new List<int>(); var right = new List<int>(); foreach (int x in arr) { if (x < pivot) { left.Add(x); } else if (x == pivot) { middle.Add(x); } else { right.Add(x); } } return [.. QuickSort(left.ToArray()), .. middle, .. QuickSort(right.ToArray())]; } Random rand = new(Random.Shared.Next()); int[] data = new int[1000]; for (int i = 0; i < data.Length; i++) { data[i] = rand.Next(1000); } // Benchmark selection sort int[] selectionData = data.ToArray(); Stopwatch sw = Stopwatch.StartNew(); SelectionSort(selectionData); Console.WriteLine($"Selection Sort Time: {sw.Elapsed.TotalSeconds:F6} seconds"); // Benchmark quick sort int[] quickData = data.ToArray(); sw = Stopwatch.StartNew(); QuickSort(quickData); Console.WriteLine($"Quick Sort Time: {sw.Elapsed.TotalSeconds:F6} seconds");
此基准测试了 1000 个随机整数的选择排序和快速排序。 由于其高效的设计,快速排序通常完成得更快。
来源
本教程介绍了 C# 中的选择排序,并将其与快速排序进行了比较。
作者
列出所有 C# 教程。