前言
难,不是一般的难。99% 的情况下,你写出的代码 不会比 Array.Sort() 更快。
看到这个题目,我想起了,刚毕业参加工作的那年冬天,部门里一位很牛的同事离职了,办理离职手续的那天我得知,同事去了微软,试用期6个月,试用期间的工作任务是改善冒泡排序,转正标准就是只要比现有的有所提升即可,不过同事告诉我很难。
我想想也是,优化一个成熟的函数,难度真的很大,要考虑的东西会很多。
我思索了很久写了一个排序算法,做了一下排序,测试结果如下:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
从测试结果来看,Array.Sort() 拥有压倒性的优势。
一、为什么 Array.Sort() 那么强呢?
1、混合算法策略
Array.Sort()不是简单的一种算法,而是采用了智能的混合算法决策,根据不同的数据规模自动选择最优的算法。
小数组使用插入排序,大数组使用 IntroSort 效果更佳。
2、智能基准选择术
针对大量重复数据的场景,Array.Sort() 使用了 IntroSort 算法的二路分区策略,将数组分为三部分,显著的提升了重复数据时的性能。
3、底层性能优化
JIT编译优化将关键代码直接内联,为 int、double 等基础类型设置了专门的快速通道。
二、实战测试
我写了代码,对几种算法进行了测试
测试完之后,我决定以后排序就用 Array.Sort() 了。
三、Array.Sort() 这么优秀,还有必要学排序吗?
虽说我写不过 Array.Sort() ,但是学习排序算法,了解其原理还是很有必要的,一是为了培养自己的编程思维,知道什么时候用什么算法,二是为了考试,你说呢。
有些特殊场景还是需要自定义排序的,比如:
1、稳定排序需求
// Array.Sort()是不稳定的,如果需要稳定排序
public static void StableMergeSort<T>(T[] array, IComparer<T> comparer)
{
// 归并排序实现,保证稳定性
}
2、特殊的数据结构
// 对于链表等特殊数据结构
public static void LinkedListMergeSort<T>(LinkedList<T> list)
{
// 专门针对链表的归并排序
}
3、外部排序
// 处理超大数据集,无法完全加载到内存
public static void ExternalMergeSort(string inputFile, string outputFile)
{
// 外部排序实现
}
四、工作中的选择
我程序我写不出,比如Array.Sort() 更优秀的算法,遇到排序问题这个是我的默认选择,理由就是:性能强、稳定、可靠。
我觉得开发过程中,应该把时间放到更有价值的业务理解上,对我来说知道一个算法的原理就够了,公司共通开发库里已经沉淀了很多通用的算法,到时候会用就可以了。
我一直深信,C# 是聪明的程序的选择,聪明的程序员的特质就是不是什么代码都自己写,二是知道什么时候用什么就够了,你说呢https://www.
作者:全小鱼

.NET 桌面应用 (WPF/WinForm) 高效自动更新解决方案
一行代码快速开发 AntdUI 风格的 WinForm 通用后台框架
WinForm + SQL Server + Modbus 实现仓库温控上位机系统开发
WinForm 开发的多功能工具:串口通信、加密解密、图像转换等功能
觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力

