查找数组的顶部和底部5个元素

时间:2016-02-10 07:00:13

标签: arrays algorithm rank

问题:

我有一个n≥10000个不同正整数的数组A.试图编写一个算法,输出A的一个元素x,使得x不在A的前5个元素中,也不是A的底部5个元素.A的前5个和后5个元素是前5个和A排序时的最后5个元素。我还需要在大约50次比较中做到这一点。

我做了什么:

我正在使用Rank的概念来解决这个问题。 我拿了6个数字并找到它的最大值。所以这将确保我的号码不在前五(前五)元素中。但是,这并不能确保我的号码不属于最后5个元素。

到目前为止的伪代码:

//从我的阵列A中选择任意6个元素。

 int max = A[0];
 for(int i = 0; i<6 ; i++)
 {
    if( A[i] > max)
        max = A[i];
 }

这将给我一个数字(最大),这肯定不会是数组的前5个元素,但我该如何处理最后5个元素?

2 个答案:

答案 0 :(得分:2)

我认为你可以通过从列表中找到而不是6个元素,而是11个随机元素(如果需要,也可能是不同的元素)来进一步改进你的算法。

在这个随机的11个元素中,对元素进行排序并选择第6个元素。

第6个元素既不是前五个也不是底部5个。

答案 1 :(得分:1)

如果你不关心选择哪个元素(只是不是底部5和前5),你所能做的只是获得11个第一个元素(你可以做任何事情来选择它们,甚至是随机的),对它们进行排序并采取中间的。

a1, a2, a3, a4, a5, Yours, a7, a8, a9, a10, a11

即使使用冒泡排序,您最终会得到(11 - 1)* 10/2 = 50次比较,但使用mergesort则会更少。