Functional programming 为什么OCaml有两个排序函数:List.sort和List.stable\u sort?

Functional programming 为什么OCaml有两个排序函数:List.sort和List.stable\u sort?,functional-programming,ocaml,Functional Programming,Ocaml,以下是文件: 根据比较函数按递增顺序对列表排序。如果比较函数的参数相等,则比较函数必须返回0;如果第一个参数较大,则返回正整数;如果第一个参数较小,则返回负整数(有关完整规范,请参阅Array.sort)。例如,compare是一个合适的比较函数。结果列表按递增顺序排序。sort保证在常量堆空间(除了结果列表的大小)和对数堆栈空间中运行 val stable_sort : ('a -> 'a -> int) -> 'a list -> 'a list 当前实现使用合并

以下是文件:


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

val stable_sort : ('a -> 'a -> int) -> 'a list -> 'a list
当前实现使用合并排序。它在常量堆空间和对数堆栈空间中运行

val stable_sort : ('a -> 'a -> int) -> 'a list -> 'a list
与List.sort相同,但排序算法保证稳定(即,比较相等的元素保持其原始顺序)

当前实现使用合并排序。它在常量堆空间和对数堆栈空间中运行

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

我认为合并排序是稳定的,对吗

OCaml如何生成
非稳定合并
排序


非静态合并排序
版本中,它更快吗?

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


只要每个需要稳定排序的代码都使用
stable\u sort
,如果将来的Ocaml版本(或替代实现)切换到不稳定的算法进行排序,则没有代码会中断。您需要将定义与实现分开。实现者保留更改实现的权利,并且对函数的行为定义非常谨慎和清晰。

ahh,好吧,这就像文档一样,即他们以这种方式编写文档。您可以看到一个关于如何使用库列表的示例。sort[94;50;6;7;8];;我应该补充一个问题吗?