Functional programming OCaml中的排序函数使用不可变或可变的数据结构吗?

Functional programming OCaml中的排序函数使用不可变或可变的数据结构吗?,functional-programming,ocaml,Functional Programming,Ocaml,OCaml在实现排序时是否使用mutable或immutable数据结构 对于许多排序算法,我们需要在列表或数组中的位置之间交换数据 我只是想知道,如果OCaml总是打算使用不可变的数据结构,那么每个exchange操作都会创建一个新的副本吗 这会影响性能吗 对于许多排序算法,我们需要在列表或数组中的位置之间交换数据 不一定 我只是想知道,OCaml是否总是打算使用不可变的数据结构 不,OCaml既有可变的数据结构,也有不可变的数据结构。但是,通常首选使用不可变的数据结构 那么每个exchang

OCaml在实现排序时是否使用
mutable
immutable
数据结构

对于许多排序算法,我们需要在列表或数组中的位置之间交换数据

我只是想知道,如果OCaml总是打算使用
不可变的数据结构
,那么每个exchange操作都会创建一个新的副本吗

这会影响性能吗

对于许多排序算法,我们需要在列表或数组中的位置之间交换数据

不一定

我只是想知道,OCaml是否总是打算使用不可变的数据结构

不,OCaml既有可变的数据结构,也有不可变的数据结构。但是,通常首选使用不可变的数据结构

那么每个exchange操作将创建一个新副本

这将取决于所讨论的数据结构。但通常情况下,在使用不可变的数据结构时,您不希望用交换单个元素的方式来表示排序算法(正如我上面所指出的,您当然不需要这样做)


例如,
List.sort
工作在一个不可变的数据结构(List)上,非常有效。它使用合并排序算法(在当前的OCaml实现中)。

Hi-sepp2k,我目前正在尝试实现许多排序算法以用于OCaml实践。例如,如果我想为一个列表实现插入排序,那么我该怎么做呢?插入排序涉及到数据交换,对吗?顺便问一下,sepp2k,你还记得有一天晚上,你帮我问了一个关于sig/接口类型的愚蠢问题吗?我完全沉浸在学习OCaml的过程中。但我现在很高兴,我踏上了这扇门,只需要对OCaml有更深的理解和实践。@JacksonTale插入排序需要在两个现有元素之间插入一个元素,而不是交换。即使在命令式语言中,每次插入都是O(n^2)(因为您有n个插入)。这取决于您如何看待它,比如说我们有
dcba
,那么步骤是:
dcba
->
cdba
->
cda
->
cbda
->
bcda
->。。。我的意思是一个接一个地交换直到最后的位置。但无论如何,我真正的问题是,如果我实现一个需要多次交换的排序,OCaml是否打算使用不可变结构?如果这是真的,那么除了您案例中的O(n^2)插入之外,每次我们都需要将所有其他元素复制到新实例?让我用另一种方式问一下,为什么List.sort不选择
快速排序
quicksort
对于不可变列表不好,因为它需要很多交换,这是原因之一吗?