C#中,当我们写List.Sort时,我们在做什么

说到排序算法,一般能想到冒泡排序,插入排序,快速排序,归并排序,堆排序。我们还知道快速排序最快。
那么我们写惯了的List.Sort内部到底采用了哪种排序方法?是不是比我们手撸一个排序快呢?
.net 对不同版本有不同处理:

  • 低于4.5,采用深度限制的快速排序
  • 不低于4.5,采用内省排序

深度限制的快速排序

为了防止过度递归,当递归超过一定限度(比如16)之后,采用堆排序。

内省式排序

是一种综合式排序,能根据数据规模能做出自适应调整的算法。

在数据量很大时采用正常的快速排序,此时效率为O(logN)。
一旦分段后的数据量小于某个阈值,就改用插入排序,因为此时这个分段是基本有序的,这时效率可达O(N)。
在递归过程中,如果递归层次过深,分割行为有恶化倾向时,它能够自动侦测出来,使用堆排序来处理,在此情况下,使其效率维持在堆排序的O(N logN),但这又比一开始使用堆排序好。

.net的实现和stl::sort实现差别不大,贴一堆源代码就不必了。细节上有些不太一样,前者不如后者做得那么极致。
这里有一篇别人写得非常透彻的文章。读过之后,不得不感叹库作者算法设计之精妙。我想你大概不会想自己写一个比库还高效能经得起各种情况考验的排序算法。

尾语:
知道一样工具的本质,才能更好的利用它。

作者:windflow

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注