F#ResizeArray sortBy稳定吗?

时间:2010-07-10 03:45:02

标签: sorting f#

函数ResizeArray.sortBy是否可以进行稳定排序,因为它不会改变键函数具有相同值的元素的顺序?

如果没有,如何在F#中编写稳定的排序?

2 个答案:

答案 0 :(得分:10)

您的问题的答案是unstable

首先ResizeArray.sortBy实现为:

module ResizeArray =
    let sortBy f (arr: ResizeArray<'T>) = arr.Sort (System.Comparison(fun x y -> compare (f x) (f y)))

ResizeArray是.Net列表集合的别名:

type ResizeArray<'T> = System.Collections.Generic.List<'T> // alias

现在让我们看一下List documentation

  

此方法使用Array.Sort,其中   使用QuickSort算法。这个   实现执行不稳定   分类;也就是说,如果有两个元素   平等,他们的订单可能不是   保存。相比之下,稳定的排序   保留元素的顺序   是平等的。

太不稳定了。如果要进行稳定排序,可以实现合并排序或仔细快速排序。然而,稳定版快速排序效率较低。

答案 1 :(得分:3)

Seq.sort稳定。