什么是最快的快速排序 - 排序算法的联盟表?

时间:2012-04-16 10:27:59

标签: sorting quicksort mergesort heapsort bucket-sort

我试图优化我的快速排序以提高性能。对于4M(1 <22)个整数项(每个4字节),它采用并行快速排序算法0​​.5(0.499703)秒来对可以支持72个并发线程(72个核心)的系统进行排序。我有兴趣了解进一步优化并行快速排序的有效方法。另外,有兴趣与其他排序算法进行比较,如果有一个排序算法的联盟表,给定一定的工作量?

1 个答案:

答案 0 :(得分:0)

据我所知,没有用于排序算法的规范排行榜。排序算法的性能取决于许多不同的因素 - 您获得的输入分布,输入的大小,编程语言的选择,所用编译器的类型和设置,核心数量,环境温度。房间,操作系统等。

至于你的另一个问题 - 如何优化你的快速排序 - 没有看到你的代码,很难肯定地说。以下是您可能想要尝试的常见快速排序优化列表。

  1. 在小输入上切换到更快的排序:插入排序以二次方运行,但对于小输入,它可以比快速排序快得多。一旦要排序的元素数量降到某个阈值以下,快速排序实现就会切换到插入排序,这种情况并不少见,这可以显着减少运行时间。

  2. 添加内省。 Introsort是快速排序的快速变体,可以跟踪递归深度,并在算法看起来退化时切换到堆栈。这可以保证运行时为O(n log n),如果不触发这种情况,只会产生很小的成本。

  3. 使用更好的分区算法。双枢轴快速排序最近出现在现场,作为传统分区算法的替代方案。它在许多输入上具有更好的性能。另外,如果您希望获得包含大量重复项的输入,请考虑使用优雅处理重复元素的分区方案。

  4. 介绍尾部呼叫消除。许多quicksort实现触发了两个需要排序的子数组的递归调用,但实际上并不需要这样做。您可以触发一个递归调用,然后通过将参数覆盖到初始调用并将整个事件放在while循环中来将第二个调用视为尾调用。