在编程世界中,C#归并排序是一种非常经典且高效的排序算法。它不仅时间复杂度稳定在 O(n log n),更重要的是它具备稳定排序的特性。本文将用通俗易懂的方式,带你从零开始理解归并排序的工作原理、为什么它是稳定的,以及如何用 C# 实现它。
在讨论归并排序之前,我们先搞清楚“稳定排序”是什么意思。
一个排序算法是稳定的,意味着:如果两个元素的值相等,那么它们在排序后的相对位置与排序前保持一致。
举个例子:
原始数组(带索引标识):[(A, 1), (B, 2), (A, 3)]排序后(按字母):稳定排序结果 → [(A, 1), (A, 3), (B, 2)] ✅不稳定排序可能 → [(A, 3), (A, 1), (B, 2)] ❌
归并排序采用“分治法”策略:
关键在于合并过程!
当比较左右两个子数组的元素时,如果左边元素 ≤ 右边元素,我们就先取左边的。这个“≤”中的“等于”情况,保证了相同值的元素中,原本在左边(即原数组中靠前)的元素会先被放入结果数组,从而保留了原始顺序。
下面是一个完整的、带有详细注释的 C# 归并排序实现:
using System;public class MergeSortExample{ // 主函数:启动归并排序 public static void MergeSort(int[] arr) { if (arr == null || arr.Length <= 1) return; int[] temp = new int[arr.Length]; MergeSortHelper(arr, temp, 0, arr.Length - 1); } // 递归分治 private static void MergeSortHelper(int[] arr, int[] temp, int left, int right) { if (left < right) { int mid = left + (right - left) / 2; MergeSortHelper(arr, temp, left, mid); // 排序左半部分 MergeSortHelper(arr, temp, mid + 1, right); // 排序右半部分 Merge(arr, temp, left, mid, right); // 合并两部分 } } // 合并两个已排序的子数组 [left..mid] 和 [mid+1..right] private static void Merge(int[] arr, int[] temp, int left, int mid, int right) { // 将原数组复制到临时数组 for (int i = left; i <= right; i++) { temp[i] = arr[i]; } int i = left; // 左子数组起始索引 int j = mid + 1; // 右子数组起始索引 int k = left; // 合并后数组的当前索引 // 合并过程:关键在 <= 判断,保证稳定性! while (i <= mid && j <= right) { if (temp[i] <= temp[j]) // 注意这里是 <=,不是 < { arr[k++] = temp[i++]; } else { arr[k++] = temp[j++]; } } // 复制左子数组剩余元素(如果有) while (i <= mid) { arr[k++] = temp[i++]; } // 右子数组剩余元素已在正确位置,无需额外操作 } // 测试示例 public static void Main() { int[] data = { 38, 27, 43, 3, 9, 82, 10 }; Console.WriteLine("排序前: " + string.Join(", ", data)); MergeSort(data); Console.WriteLine("排序后: " + string.Join(", ", data)); }} 为了验证归并排序的稳定性,我们可以对包含重复值的对象进行排序。例如,定义一个 Person 类,按年龄排序,但希望同龄人的原始顺序不变:
// 简化版测试(使用元组模拟)var people = new (string name, int age)[]{ ("Alice", 25), ("Bob", 30), ("Charlie", 25), ("David", 30)};// 使用归并排序按 age 排序(需自定义比较逻辑)// 结果应为:Alice(25), Charlie(25), Bob(30), David(30)// Alice 在 Charlie 前面,Bob 在 David 前面 —— 顺序保留! 通过本文,你已经掌握了:
无论你是初学者还是有一定经验的开发者,理解C#排序教程中的归并排序,都能帮助你在面试或实际项目中更自信地处理数据排序问题。记住,归并排序稳定性是它区别于快速排序等不稳定算法的重要优势之一,尤其在需要保留原始顺序的场景(如数据库多字段排序)中非常有用。
掌握稳定排序,让你的代码更可靠、更专业!
本文由主机测评网于2025-12-19发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210111.html