我最近学会了如何使用堆和堆排序的美妙之处。我决定将 heapsort 与 C++ 中的 std::sort 和 Java 中的 Arrays.sort() 进行比较。我对一个整数数组进行了排序,每个整数在 <0 的范围内随机生成;2000000000)
我在 Java 中将 100,000,000 个整数生成到一个数组中,然后运行 Arrays.sort(),然后生成新的随机序列并运行我的 heapSort()。这是我的 Java 程序的输出:
Arrays.sort time: 10.923 seconds.
Heap sort time: 1.402 seconds.
所以堆排序快了大约 8 倍。
然后我在 C++ 中运行了类似的代码,这次使用 std::vector 作为我的容器(因为 std::sort 需要两个迭代器)。
C++ 结果:
Heapsort: 3.213
std::sort: 37.264
所以在我的程序中,std::sort 慢了大约 12 倍。
在 Java 中,我使用 System.currentTimeMilis() 测量时间,而在 C++ 中,我使用来自 .
这是在 Windows 7、四核 Intel i5 2500k、超频至 4.8GHz 上进行测试的。C++ 是用-Wall -pedantic
标志编译的。
谁能告诉我发生了什么?堆排序真的那么快吗?还是我在代码中犯了错误?我不想用大量代码淹没这篇文章,所以我将在本文末尾链接它。
顺便说一句:是的,我知道 Arrays.sort() 是稳定的,而 heapsort 不是。Java 没有不稳定的排序(至少,我还没有找到)。这就是为什么我在 C++ 中使用 std::sort 来查看它是否与稳定性有关。
源代码,C++ 和 Java:https ://gist.github.com/anonymous/7475399