锦标赛算法用于找最大值和次大值或者最小值和次小值可以做到平均查询次数最少。主要是在找最大值的过程中,次大值一定和最大值比较过,所以在和最大值比较过的数中找即可。查询次数为N+logN-2次。
#include <bits/stdc++.h>
using namespace std;
const int N=105;
int a[N],res[2],n;//res[1]为最大值,res[0]为次大值。
void search(int left,int right){
if(left==right){
res[0]=res[1]=left;
}
else if(left==right-1){
if(a[left]>a[right]){
res[1]=left;
res[0]=right;
}
else{
res[1]=right;
res[0]=left;
}
}
else{
int m=(right-left+1)/2;
for(int i=left;i<left+m;i++){
if(a[i]>a[i+m]){//把较大值换到右半边
int tmp=a[i];
a[i]=a[i+m];
a[i+m]=tmp;
}
}
search(left+m,right);
if(a[res[1]-m]>a[res[0]]) res[0]=res[1]-m;
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
search(0,n-1);
cout<<a[res[1]]<<' '<<a[res[0]]<<endl;
return 0;
}