快速排序与选择排序(Java与C++)

Tim*_*key 8 c++ java compare quicksort

我创建了两个项目.一个用C++编写,一个用Java编写.我为QuickSort和SelectionSort进行了时间试验.奇怪的是,我发现了一些非常奇怪的行为.

以下是10,000个数组的结果:

SelectionSort Java:80毫秒

SelectionSort C++:2914毫秒

QuickSort Java:1毫秒

QuickSort C++:约45秒

现在叫我疯了但我总是被告知QuickSort是最快的.这在Java中证明是正确的,但在C++中它完全被关闭.

所以我的问题是,C++是否以不同的方式处理QuickSort?

我试图在语言之间保持相同的功能,除了在C++和int数组中使用向量之外,它们完全相同.无论如何我更喜欢使用向量,因为我想在C++中使用sort的实际项目需要一个向量.

我确定这是一个愚蠢的错误或我正在制作的东西,但请提供一些见解,为什么会发生这种情况.

编辑:

我相信我明白了问题所在.感谢大家的极快响应.我将修改我的代码以按预期工作.我知道这是一个简单的错误.此外,虽然提出的问题非常令人尴尬,但回答是有教育意义的.

Mar*_*k B 18

您的quicksort函数会在每次递归调用时按值返回整个向量,即使函数在适当位置修改它也是如此.可能会回归所有那些临时工,然后把它们扔掉,伤害表现.

只需将函数更改为void并删除结束返回并查看其行为方式.

编辑:如果您更习惯于几乎所有东西都是垃圾收集引用的Java,请注意在C++中按值返回(就像返回类型一样)通常会复制所返回的内容.正如@Johannes Schaub - litb所指出的那样,编译器甚至无法优化返回,因为它没有返回自动(本地)变量.

编辑2:如果你不是这样做的练习,你应该使用std::sortstd::stable_sort(后者如果你知道你的数据已经几乎已经排序,或者你需要保留重复的顺序).例如std::sort(A.begin(), A.end());


orl*_*rlp 3

您将在每次递归调用时返回一个完整的向量。这需要花费大量的时间(99.99%的时间都花在了复制上)。

顺便说一句,您可以使用 C++ 中的 STL 排序函数,它保证是快速排序(尽管这会扰乱您的分析,因为您没有进行真正的比较)。

编辑:

显然std::sort不能保证是快速排序,但保证是 O(n*log(n))。来源