题目:
给定数组A[0..n-1],试设计一个算法,在最坏情况下用n+logn次比较找出A[0..n-1]中元素的最大值和次大值。
输入:序列长度、数组A
输出:maxnum、cmaxnum
Input:
7
1 2 3 4 5 6 7
Output:
7 6
思想:
用分治法将数组中的数分为两个序列,递归求出左右两个序列的lmax、lcmax、rmax、rcmax。同时比较一下,得出每次分出去的maxnum和cmaxnum,然后层层递归最后得到maxnum和cmaxnum。
Code:
#include <bits/stdc++.h> using namespace std; int num[1001]; void maxcmax(int i,int j,int &maxnum,int &cmaxnum){ int lmax,lcmax,rmax,rcmax,mid=(i+j)/2; if(i==j) maxnum=cmaxnum=num[i]; else if(i=j-1){ maxnum=max(num[i],num[j]); cmaxnum=min(num[i],num[j]); } else{ maxcmax(i,mid,lmax,lcmax); maxcmax(mid+1,j,rmax,rcmax); if(lmax>rmax){ maxnum=lmax; cmaxnum=max(rmax,lcmax); } else if(lmax<rmax){ maxnum=rmax; cmaxnum=max(lmax,rcmax); } else maxnum=cmaxnum=lmax; } } int main(){ int n,maxnum,cmaxnum; cin>>n; for(int i=0;i<n;i++) cin>>num[i]; maxcmax(0,n-1,maxnum,cmaxnum); cout<<maxnum<<' '<<cmaxnum<<endl; return 0; }