问题
给定一个长度为的数组
,请用比较次数小于
的算法求出数组中的第二大元素。
求解
看到题目中的比较次数小于就知道不能先用一次循环找出最大元素,接着利用最大元素再一次循环找到第二大元素。
那么,应该怎么解决呢。这时就需要用到我们的锦标赛算法(Tournament Algorithm)了。该算法的主要思想就是让长度为的数组中的元素两两一组,一共分成
组,每一轮都是这样分;每一轮都将两两比较中较大的留下来,较小的就直接丢弃;因此每轮过后元素都会少一半;经过
后留下一个数,那个数就是最大的数;那么怎么寻找第二大的数呢?我们发现,在淘汰的过程中,最大的数肯定和第二大的数见过面(也就是比较过)。因此,我们只需在淘汰的过程中为每一个数建立一个链表,把被淘汰的数放到留下的数的链表的表尾;当我们找到最大的数的时候,只需将最大的数的链表中最大的数取出来就得到了第二大的数了。
由于从个元素淘汰到只剩一个元素需要比较
次;寻找第二大元素需要比较
次;因此其时间复杂度为
。
下面是手稿演示图: