为什么OCaml有两个排序函数:List.sort和List.stable_sort?

时间:2013-02-22 17:23:25

标签: functional-programming ocaml

这是doc:


val sort : ('a -> 'a -> int) -> 'a list -> 'a list

根据比较函数按递增顺序对列表进行排序。如果比较函数的参数比较相等,则必须返回0;如果第一个较大,则必须返回正整数;如果第一个较大,则返回负整数(有关完整规范,请参阅Array.sort)。例如,compare是一个合适的比较函数。结果列表按递增顺序排序。 List.sort保证在常量堆空间(除了结果列表的大小)和对数堆栈空间中运行。

当前实现使用Merge Sort。它在常量堆空间和对数堆栈空间中运行。

val stable_sort : ('a -> 'a -> int) -> 'a list -> 'a list

与List.sort相同,但the sorting algorithm is guaranteed to be stable(即比较相等的元素保持原始顺序)。

当前实现使用Merge Sort。它在常量堆空间和对数堆栈空间中运行。


我认为merge sort无论如何都是稳定的,对吗?

OCaml如何产生non-stable merge排序?

non-statble merge sort版本中,它更快吗?

2 个答案:

答案 0 :(得分:6)

合并排序是稳定的,但排序使用合并排序的事实不是其合同的一部分。请注意,它只说“当前实现使用...”。无法保证将来会继续使用合并排序,因此如果在代码中使用List.sort,则无法保证排序将保持稳定,即使它在当前实现中可能是稳定的。

只要每个需要稳定排序的代码都使用stable_sort,如果Ocaml的未来版本(或替代实现)切换到sort的不稳定算法,则代码不会中断。

答案 1 :(得分:1)

您需要将定义与实现分开。实现者保留了更改实现的权利,并且对于如何定义函数的行为非常谨慎和明确。