函数ResizeArray.sortBy是否可以进行稳定排序,因为它不会改变键函数具有相同值的元素的顺序?
如果没有,如何在F#中编写稳定的排序?
答案 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稳定。