【发布时间】: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