这是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
版本中,它更快吗?
答案 0 :(得分:6)
合并排序是稳定的,但排序使用合并排序的事实不是其合同的一部分。请注意,它只说“当前实现使用...”。无法保证将来会继续使用合并排序,因此如果在代码中使用List.sort
,则无法保证排序将保持稳定,即使它在当前实现中可能是稳定的。
只要每个需要稳定排序的代码都使用stable_sort
,如果Ocaml的未来版本(或替代实现)切换到sort
的不稳定算法,则代码不会中断。
答案 1 :(得分:1)
您需要将定义与实现分开。实现者保留了更改实现的权利,并且对于如何定义函数的行为非常谨慎和明确。