找到快速排序中位数的中位数

时间:2013-06-10 21:15:25

标签: algorithm sorting optimization quicksort median-of-medians

我正在使用中位数算法快速排序。我通常使用selection-sort来获得5个元素的子数组的中位数。但是,如果有数千个子阵列,则意味着我必须找到一千个中位数的中位数。我想我不能使用选择排序来找到中位数,因为它不是最优的。

问题:

有人能建议我找到中位数的更好方法吗? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

中位数算法算法无法通过找到每个大小为5的块的中位数,然后对它们运行排序算法来查找中位数。相反,您通常会对每个块进行排序,取每个块的中位数,然后递归调用这些中位数的中位数算法算法以获得良好的支点。在快速排序中使用中位数算法算法的情况非常罕见,因为中位数中值算法的O(n)运行时间中的常数因子非常大,以至于显着降低了性能。

您可以尝试使用这种原始方法进行一些改进。获得良好支点的最简单方法就是选择一个随机元素 - 这会导致Θ(n log n)运行时具有非常高的概率。如果你不习惯使用随机性,你可以尝试使用introselect algorithm,这是对中位数算法的修改,试图通过猜测一个可能是一个好的支点的元素来降低常数因子。如果找到一个,则提前切断递归。你也可以尝试编写introsort,它使用quicksort并切换到不同的算法(通常是heapsort),如果它看起来算法正在退化。

希望这有帮助!