找到数组的中间元素

时间:2011-01-09 14:36:15

标签: algorithm

  

可能重复:
  How to find the kth largest element in an unsorted array of length n in O(n)?

大家好, 我在采访中遇到了一个问题。

问题:

  

整数数组将作为输入给出,您应该在排序时找到中间元素,但不进行排序。

     

例如。

     

输入:1,3,5,4,2

     

输出:3

     

当你对给定的输入数组进行排序时,它将是1,2,3,4,5,其中中间元素是3。

     

你应该在一次通过中找到它而不进行排序。

任何解决方案吗?

3 个答案:

答案 0 :(得分:2)

这是selection algorithm问题,即O(n)。

编辑,但如果您确定项目是连续的,您可以计算最小和最大元素数量(一次通过)并返回[最小+(最大 - 最小+ 1)/ 2] < / p>

答案 1 :(得分:0)

对我而言,听起来你可以直接使用std::nth_element - 不知道这是否是可接受的答案。

答案 2 :(得分:0)

您可以使用“已修改”的快速排序来查找它。它以O(n ^ 2)运行,但平均来说应该相当快。你所做的就是每次选择一个支点时,你都要检查有多少元素小于支点,有多少元素更大。如果有相同的元素小于和大于枢轴,则枢轴是中位数。如果不是,则只能递归到包含元素的部分。最糟糕的情况是,您将执行完整的排序。

示例:

包含7个元素的数组,我们正在寻找第4个最小的元素。

5 3 8 6 7 1 9

假设quicksort选择3作为枢轴,而不是:

1 3 5 8 6 7 9

现在,您希望子阵列中的第二个最小[5,8,6,7,9]。继续前进,直到枢轴是您在当前迭代中搜索的第k个最小值。

我认为这个解决方案对于面试问题非常有用,尽管你应该提到有一个O(n)确定性解决方案。