gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:59:52 25 4
gpt4 key购买 nike

这是文档:


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

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

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

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

与 List.sort 相同,但排序算法保证稳定(即比较相等的元素保持其原始顺序)。

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


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

OCaml 如何生成不稳定合并 排序?

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

最佳答案

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

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

关于functional-programming - 为什么OCaml有两个排序函数: List. sort和List.stable_sort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15029848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com