建议我们在快速排序之前对数组进行洗牌。
但是,如果我们想要快速排序列表,则首先将随机播放列表取O(nlogn)
,例如,我们为列表中的每个项目分配一个随机密钥,然后合并(key,item)列表。< / p>
然后我的问题是:
如果我们必须先花费O(nlogn)
来重新排列列表,那么在OCaml中为列表实现快速排序有什么意义呢?
我们应该直接使用mergesort,对吧?
答案 0 :(得分:5)
在OP的问题中:
但是,如果我们想要快速排序列表,那么首先是洗牌列表 拿O(nlogn)
我认为如果你先将列表转换为数组然后使用Fisher–Yates shuffle,那么随机改组只花费O(n)
时间,这也是Python的random.shuffle中使用的算法。
答案 1 :(得分:2)
我会按照你的建议使用mergesort。 Mergesort甚至比quicksort更适合函数式语言。