我需要设计一个算法,使用名为“MED3”的函数找到未排序数组中的第k个最小元素: 如果数组被排序,则此函数查找数组的n / 3(floor)和2n / 3(ceil)元素(非常类似于中位数,但不是n / 2,而是返回这些值)。
我考虑过围绕这两个值的分区,而不是像QuickSelect那样继续,但问题是“MED3”不返回2个值的索引,只返回值。
例如,如果数组为:1,2,10,1,7,6,3,4,4则返回2(n / 3值)和4(2n / 3值)。
我还想过遍历数组并将2到4之间的所有值(例如,在上面给定的数组中)取到新数组然后再次使用“MED3”,但可以重复(如果是数组)是2,2,2,2,...,2我每次都会拿走所有的元素。
有什么想法吗?我必须使用“MED3”。 * MED3就像一个黑盒子,它以线性时间运行。
谢谢。
答案 0 :(得分:0)
我认为你是在正确的轨道上,但我建议删除前面的< = MED3.floor()和前n的n / 3值,而不是2到4。 / 3值>> = MED3.ceil()。这避免了重复过多的问题。如果两次通过/周期过于昂贵,则可以删除所有值< MED3.floor()+最多总共n / 3个值= MED3.floor()(对ceil()做同样的事情)
然后重复,直到你到达第k个最小的目标。