顺序统计算法[2019.5.25]

题目:

  给定数组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;
}

 

posted @ 2019-06-14 10:12  cruelty_angel  阅读(563)  评论(0编辑  收藏  举报