为什么Rust的排序方法会分配内存?

时间:2014-10-07 12:36:59

标签: sorting rust dynamic-allocation

std::slice::MutableSliceAllocating上的sort_bycollections::vec::Vec上的sort_by等方法会记录到"分配大约2 * n,其中n是长度&# 34; 。我不认为好的C ++ std::sort实现分配(在堆上),但它们实现了相同的O(n log n)复杂性。虽然,与C ++ std :: sort不同,Rust排序方法是稳定的。

为什么Rust排序方法会分配?对我来说,它不适合"零成本抽象" 广告here

2 个答案:

答案 0 :(得分:7)

如评论中所述,这是一种稳定的排序,需要执行O(n)空间。最好的O(n log n)稳定排序,mergesort,需要大约½n个临时项目。 (我不熟悉Rust,所以我不知道它为什么需要四次。)

可以在O(log n)空间中实现稳定排序,但只能通过mergesort variant来获得O(nlog²n)时间。

答案 1 :(得分:6)

我意识到这是一个老帖子,但我在谷歌上找到它并且流行的答案是错误的。实际上可以使用O(1)(非偶数对数)存储器和最坏情况O(nlogn)时间来执行稳定的就地排序。参见例如GrailSort或WikiSort。