设计一种算法,用于在存在重复项的情况下查找阵列A的第k个最大元素。在以稳定的方式对A进行分类之后,将第k个最大元素定义为A [k-1]。
我可以考虑使用quickselect算法,但它不稳定。另一种方法是使用二进制堆并以稳定的方式断开连接(即从左到右扫描数组时插入时间),但这会产生一个具有O(n * log k)时间和O(k)的算法空间。
有没有办法在O(n)中这样做?如果可能,请在java中提供实现。
答案 0 :(得分:0)
如果你可以使用O(n)额外空间,那么quickselect的分区步骤可以很容易地在O(n)时间内保持稳定:而不是交换元素,只需构建4个单独的列表(从左到左) ,从 - 从右到左,从左到右,从右到右),然后按顺序用它们覆盖原始数组。