我应该在OCaml的quicksort之前洗牌吗?

时间:2013-07-17 21:16:20

标签: ocaml

建议我们在快速排序之前对数组进行洗牌。

但是,如果我们想要快速排序列表,则首先将随机播放列表取O(nlogn),例如,我们为列表中的每个项目分配一个随机密钥,然后合并(key,item)列表。< / p>

然后我的问题是:

如果我们必须先花费O(nlogn)来重新排列列表,那么在OCaml中为列表实现快速排序有什么意义呢?

我们应该直接使用mergesort,对吧?

2 个答案:

答案 0 :(得分:5)

在OP的问题中:

  

但是,如果我们想要快速排序列表,那么首先是洗牌列表   拿O(nlogn)

我认为如果你先将列表转换为数组然后使用Fisher–Yates shuffle,那么随机改组只花费O(n)时间,这也是Python的random.shuffle中使用的算法。

答案 1 :(得分:2)

我会按照你的建议使用mergesort。 Mergesort甚至比quicksort更适合函数式语言。