采访算法:找到大小为n的数组中的两个最大元素

All*_*ang 8 sorting algorithm

这是我在网上看到的一个面试问题,我不确定我是否有正确的想法.

问题出在这里:

设计一种算法来查找n个数字序列中的两个最大元素.比较次数需要为n + O(log n)

我想我可以选择快速排序并在找到两个最大的元素时停止?但不是100%肯定它.任何人都有想法请分享

Run*_*ild 15

递归地拆分数组,找到每一半中最大的元素,然后找到最大元素与之比较的最大元素.第一部分需要n比较,最后部分需要O(log n).这是一个例子:

1 2 5 4 9 7 8 7 5 4 1 0 1 4 2 3
2   5   9   8   5   1   4   3
5       9       5       4
9               5
9
Run Code Online (Sandbox Code Playgroud)

在每一步,我正在合并相邻的数字并取两者中的较大者.它需要n比较才能得到最大的数字9.然后,如果我们看一下9被比较的每个数字(5,5,8,7),我们看到最大的数字是8,这必须是数组中的第二大.由于此处有O(log n)级别,因此需要进行O(log n)比较.

  • 我看到几个问题,首先是“最后一部分”不需要 O(log n) 它需要 O(n),虽然有 log n 级别,但比较的总数是 n/2 + n/4 + n /8 + n/16 + ... = n 另一个问题是从哪里获得与数字 9 进行比较的数字列表? (2认同)