多次使用不稳定排序是否会为数据集生成相同的结果?

时间:2014-01-01 17:01:07

标签: algorithm sorting heapsort

Heapsort是一种不稳定的类型。在具有相同数据集的不同机器上使用它是否保证结果数据集中的顺序相同,即使它不稳定?

编辑:实现是在不同机器上运行的C ++ STL heap_sort。

3 个答案:

答案 0 :(得分:4)

如果为同一个实现提供相同的输入,它将输出相同的结果。这被称为“决定论”。

唯一的例外是,如果算法是随机的(即采样/混洗算法或bogosort)。您也可以通过向(伪)随机数生成器提供相同的种子来缓解这种情况,但Heapsort无论如何都不是随机算法,因此结果应该相同。

排序的稳定性是指如果对所有属性的子集进行排序,则始终会获得与所有属性相同的排序。 I found the example on Wikipedia quite intuitive:

  

在对某些类型的数据进行排序时,只会检查部分数据   确定排序顺序时。例如,在卡片分类中   在右边的示例中,卡片按其等级排序,并且   他们的诉讼被忽略了。结果是它有可能   原始列表的多个不同的正确排序版本。   根据,稳定的排序算法选择其中之一   以下规则:如果两个项目相等,就像两张5张卡一样,   然后他们的相对顺序将被保留,如果一个人来了   在输入中的另一个之前,它也将在另一个之前   输出。

总结一下:如果对同一确定性算法的输入保持不变,你肯定会得到相同的结果。

只是为“相同输入”添加一个小定义。输入的顺序必须相同。例如:

 Input 1: 2 1 3 5 4 3
 Input 2: 5 4 3 2 1 3

对这两个列表进行排序会在主要属性中显示相同的结果:

 Result: 1 2 3 3 4 5

然而,在不稳定的情况下,不保证3之后的序列相同(当查看附加的其他属性时)。

答案 1 :(得分:1)

只要算法是确定性的(Heapsort或任何此类算法),在不同的机器上运行它将保证相同的输出。

答案 2 :(得分:1)

问题的答案,“多次使用不稳定排序会对数据集产生相同的结果吗?”在一般情况下是强调的。考虑一个随机三个Quicksort实现的中值。这样每次都会给你一个不同的分区,所以对同一个数据集运行两次很可能会给出相同值的不同排序。

堆排序可能应该是确定性的。但除非记录在案,否则我不会指望它。