【问题标题】:Is .NET 4.5 introspective implementation of Array.Sort deterministic?.NET 4.5 内省的 Array.Sort 实现是确定性的吗?
【发布时间】:2014-02-28 17:10:51
【问题描述】:

.NET 4.5 将 Array.Sort 的实现更改为所谓的“内省排序”,这是一种混合算法,包括根据输入数据在快速排序、插入排序和堆排序之间进行选择。这里有详细说明:

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

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

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

我想我打算查看代码以帮助尝试确定内省排序是否是确定性的,但我希望这里有人知道并且可以节省我的精力;)

谢谢! 瑞恩

【问题讨论】:

  • 不,这就是“不稳定”的意思。如果相等比较器没有足够的选择性,则任意输入数据不会以相同的顺序重复排序。
  • 如果Array.Sort 页面上没有记录该算法是确定性的,那么依赖它是非常冒险的。毕竟,你刚刚看到 4.5 改变了算法。它可以再次改变。
  • HansPassant - 我的意思是它会以相同的顺序重复排序,给定相同的输入(对于任何任意输入)。 @usr - 不幸的是,有人基本上依赖它在 4.0 中是确定性的,现在我们已经升级了,我们发现了差异。我们想做的是针对 4.0 进行编译并使用相同的集合来取回我们得到的东西,我们只是想确保当我们这样做时,我们可以依赖与以前相同的排序。也就是说,4.0 中的快速排序实现 Array.Sort 是确定性的吗?
  • @user3365745 好点,只是因为它不稳定,并不意味着它是不确定的。

标签: .net arrays sorting deterministic


【解决方案1】:

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

因此,您想了解 对于特定版本Array.Sort 是否具有确定性。这是一个容易得多的问题。

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

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

【讨论】:

  • 是的,你是对的。我会看一看,并报告我的发现。
  • 经过审查,排序似乎确实是确定性的。我查看了排序代码 here 并发现了类似的 SO 问题 here
猜你喜欢
  • 2012-09-12
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 2010-09-13
  • 2012-08-25
  • 2016-12-18
相关资源
最近更新 更多