我目前正在实施Quickselect Algorithm以获取列表中最好的n个元素。 在这种情况下,“最佳”元素是最大的元素。
我的问题如下:
我发现这在许多重复元素的情况下表现不佳,因为最后未排序的值将全部相同,并且在该点,左边界在每次迭代时仅增加1,而不管枢轴索引如何
有没有办法解决这个问题并在这种情况下中止?
答案 0 :(得分:2)
Quickselect基于Quicksort算法。
根据Quicksort complexity when all the elements are same?,当所有元素相等时,Quicksort可以达到最坏情况下的时间复杂度。
该链接还提供了解决方案[1]如何加速Quicksort。由于Quickselect基于Quicksort,类似的解决方案可能对您有所帮助。
[1]解决方案提到了分区的想法。 CS.SE有一些问题包括代码并比较Quicksort的2个分区算法,即 Lomuto 建议的方法和 Hoare :CS.SE: Quicksort Partitioning Hoare vs Lomuto建议的方法。
明确的答案还指出Hoare的变体更有效,而Lomuto的更容易正确实现。因此,根据您的情况,后者可能就足够了。