.NET 4.5是否具有Array.Sort确定性的内省实现?

时间:2014-02-28 17:10:52

标签: .net arrays sorting deterministic

.NET 4.5将Array.Sort的实现更改为所谓的“内省排序”,这是一种混合算法,包括根据输入数据在quicksort,insertionsort和heapsort之间进行选择。详情如下:

http://msdn.microsoft.com/en-us/library/6tf1f0bc(v=vs.110).aspx

有充分证据表明排序是“不稳定的”,这意味着包含相同排序顺序值的两个元素可能会也可能不会保留原始输入的顺序。但是,我需要知道它是否是“确定性的”,因为任何输入数据都会在每次排序时可重复地返回相同的输出数据。具体来说,我知道快速排序可以确定性地或非确定性地实现(如果随机选择枢轴),但我不确定哪种实现用于.NET的内省排序。

从我的测试来看,它似乎是确定性的,因为我没有看到任何特定的数据集在运行之间返回不同,但显然你不能仅仅因为你没有看到它而证明某些东西不存在: - /

我想我计划查看代码以帮助我们确定内省排序是否具有确定性,但我希望这里的某个人能够随心所欲地知道并且可以节省我的努力;)

谢谢!    莱恩

1 个答案:

答案 0 :(得分:1)

  

不幸的是,有人基本上依赖它是确定性的   4.0,现在我们已经升级,我们发现了差异。我们要做的是针对4.0编译并使用相同的集合来获取   回到我们得到的东西,我们只想确保当我们做的时候   那个,我们可以依赖它们和以前一样的种类。   换句话说,4.0中的快速排序实现Array.Sort   确定性?

因此,您希望找出特定版本的 Array.Sort是否具有确定性。这是一个更容易解决的问题。

反编译.NET BCL代码(或查看参考源)。如果实现仅使用确定性操作(即不使用Random),则结果也是确定性的。

上次我看到排序代码只适合几页。你会快速筛选它。我的猜测:它显然是确定性的(如果您的比较器也是如此!)。