锦标赛算法初步

锦标赛算法用于找最大值和次大值或者最小值和次小值可以做到平均查询次数最少。主要是在找最大值的过程中,次大值一定和最大值比较过,所以在和最大值比较过的数中找即可。查询次数为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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值