.NET4.5对Array.Sort的内省实现是确定性的吗?

.NET4.5对Array.Sort的内省实现是确定性的吗?,.net,arrays,sorting,deterministic,.net,Arrays,Sorting,Deterministic,.NET 4.5将Array.Sort的实现更改为所谓的“内省排序”,这是一种混合算法,包括根据输入数据在快速排序、插入排序和堆排序之间进行选择。详情如下: 众所周知,排序是“不稳定的”,这意味着包含相同排序顺序值的两个元素可能会或可能不会保留原始输入的顺序。然而,我需要知道它是否是“确定性的”,即任何任意输入数据在每次排序时都会重复返回相同的输出数据。具体地说,我知道快速排序可以以确定性或非确定性的方式实现(如果轴是随机选择的),但我不确定哪个实现用于.NET的内省排序 从我的测试来看,这似

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

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

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

我想我打算看一下代码,看看内省排序是否是确定性的,但我希望这里有人能马上知道,并能帮我省力;)

谢谢! 瑞安

不幸的是,有些人基本上依赖于它的确定性 4.0,现在我们已经升级了,我们正在发现差异。我们要做的是针对4.0进行编译,并使用相同的集合来获取 回到我们所得到的,我们只是想确保 那就是,我们可以相信这些种类和以前一样。 换句话说,是4.0中的快速排序实现数组.Sort 确定性

因此,您希望了解特定版本的是否确定
Array.Sort
。这是一个容易得多的问题

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


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

不,这就是“不稳定”的意思。如果相等比较器没有足够的选择性,则任意输入数据不会以相同的顺序重复排序。如果未在
数组中记录该数据。排序
页面上说明该算法是确定性的,则依赖它是非常危险的。毕竟,你刚刚看到4.5改变了算法。它可以再次更改。HansPassant-我的意思是,给定相同的输入(对于任意输入),它将以相同的顺序重复排序@usr-不幸的是,有人基本上依赖于它在4.0中的确定性,现在我们已经升级了,我们正在发现差异。我们想做的是针对4.0进行编译,并使用相同的集合来获取我们得到的,我们只是想确保当我们这样做时,我们可以依赖与以前相同的排序。换句话说,quicksort实现数组.Sort In 4.0是确定性的吗?@user3365745很好,仅仅因为它不稳定,并不意味着它是不确定的。是的,你是正确的。我会看一看,然后报告我的发现。经过审查,这种分类似乎确实是确定的。我查看了排序代码,并发现了一个类似的SO问题