有效地选择中位数及其左侧和右侧的元素


14

假设我们有一个组Ñ编码器。S={a1,a2,a3,,aN}N

到目前为止,每个编码员都具有等级和金牌数量E iRiEi

一家软件公司希望恰好雇用三个编码员来开发应用程序。

为了聘请三位编码员,他们制定了以下策略:

  1. 他们首先以等级升序和金牌降序排列编码器。
  2. 他们从这个排列好的列表中选择三个中间编码器。例如,如果排列的列表是它们选择a 2a 3a 1编码器。(a5,a2,a3,a1,a4)(a2,a3,a1)

现在,我们必须通过为此任务编写程序来帮助公司。

输入:

第一行包含,即编码器的数量。N

然后,第二行包含收视个编码器。Rii

第三行包含 i个编码器。

输出:

仅显示一行,其中包含公司将选择的三个编码器获得的金牌总数。


3
因此,评分较高的编码器总是获得较少的奖牌??如果不是,那么您实际上使用什么顺序进行排序?
JeffE 2012年

Answers:


16

kn/2,n/21,n/2+1


6
如果愿意,您可以运行一次选择算法来找到中位数,然后一口气分别在右侧和左侧分区中找到最小值和最大值。
Zach Langley

@Sid @ Zach Langley嗨,您可以提供伪代码.i通过Wiki paedia,但是有点难以理解。因此,请您提供伪代码非常感谢!
2012年

@Jack您熟悉quicksort的工作原理吗?随机选择算法本质上是相同的,只是它仅在每个枢轴的一侧重复进行。
Zach Langley

6
@Jack:有关选择算法的维基百科文章(在Sid的答案中链接)包含伪代码。Google也可以。
JeffE 2012年

@Sid ::我读了wiki算法(基于分区的一般选择算法)。我们是否必须用k = n / 2,k = n / 2-1,k / 2调用选择函数3次。调用函数select时的left,right值。在分区函数中,分区索引的值也将是这个值。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.