方法一、比较笨的方法
先找到本数组中的最大数X,需要n-1次比较,再在剩下的数组中去找最大数X’,需要n-2次比较
则X’就是第二大的数,这需要(n-1) + (n-2)次比较
方法二、我们也可以在数组中,两数结合,分别求出最大值 和 次大值,之后每两个数结合求出的最值 在相互比较,得到最值得最大值 和 次大值
具体思路:
把数组中的每两个元素分为一组,每组中的最大数为F,第二大数为S。
假设相邻两组的最大数和第二大数分别是:Fleft,Si 和 Fright,Sj,。
则这两组合并为一组后,其中最大数和第二大数可能是:
1、若Fi > Fj,则最大数是Fi;
若Si >Fj,则第二大数是Si;否则,第二大数是Fj
2、若Fi< Fj,则最大数是Fj
若Fi>Sj,则第二大数是Fi;否则,第二大数是Sj
比较次数:共有N/2组,每组需要比较倆次得出本组的最大数和第二大数;共需比较N/2 * 2次。
方法三、分治法
思路:和上面的思路是一样的
把数组分成两部分,其最大数和第二大数分别是:Fleft,Sleft,Fright,Sright。合并时的情况可能为:
1、Fleft > Fright,最大数是Fleft;若Sleft>Fright,则第二大数是Sleft,否则第二大数是Fright;
2、Fleft < Fright,最大数是Fright;若Fleft>Sright,则第二大数Fleft,否则第二大数是Sright。