从数组区间A[lo,hi)中找出最大的两个整数A[x1]和A[x2]

从数组区间A[lo,hi)中找出最大的两个整数A[x1]和A[x2]

假设 : A[x1]>=A[x2]

方法一:
void max2(   int A[],   int lo,   int hi,   int  &x1,   int  &x2)   //A[x1]>=A[x2]     1<n=hi-lo
{
    for (x1=lo,int i=lo+1;   i<hi;  i++ )          //扫描A[lo,hi),  找出A[x1]
    {
        if(A[xi]<A[i])                                       //hi-lo-1=n-1
            x1=i;
    }
    for (x2=lo,int i=lo+1;   i<x1;  i++ )        //扫描A[lo,x1)
    {
        if(A[x2]<A[i])                                        //x1-lo-1
            x2=i;
    }
    for (int i=x1+1;   i<hi;  i++ )                   //再扫描A(x1,hi),找出A[x2]
    {
        if(A[x2]<A[i])                                      //hi-x1-1
            x2=i;
    }
}

总共比较次数为 (n-1)+(n-2)=2n-3
Θ ( 2 n − 3 ) \Theta(2n-3) Θ(2n3)

方法二:
void max2(   int A[],   int lo,   int hi,   int  &x1,   int  &x2) 
{
    if(A[x1=lo]<A[x2=lo+1])    swap(x1,x2);
    for(int i=lo+2; i<hi;i++)
    {
        if(A[x2]<A[i])
            if(A[x1]<A[x2=i])
                swap(x1,x2);
    }
}

最好情况:1+(n-2)*1=n-1

最坏情况:1+(n-2)*2=2n-3

方法三:递归 分治
void max2(   int A[],   int lo,   int hi,   int  &x1,   int  &x2)
{
    if(lo+2==hi)
    {
        if(A[x1=lo]<A[x2=lo+1])    swap(x1,x2);
    }
    
    if(lo+3==hi)
    {
        if(A[x1=lo]<A[x2=lo+1])    swap(x1,x2);
        if(A[x2=lo+1]<A[x3=lo+2])    swap(x2,x3);
         
    }
    int mi=(lo+hi)/2;
    int x1L,x2L;  max2(A,lo,mi,x1L,x2L);
    int x1R,x2R;  max2(A,lo,mi,x1R,x2R);
    
    if(A[x1L]>A[x1R])
    {
        x1=x1L;    x2=(A[x2L]>A[x1R])  ?  x2L :x1R;
    }else{
        x1=x1R;x2=(A[x1L]>A[x2R])  ?  x1L :x2R;
    }
}

T ( n ) = 2 ∗ T ( n / 2 ) + 2 < = 5 n / 2 − 2 T(n)=2*T(n/2)+2 <=5n/2-2 T(n)=2T(n/2)+2<=5n/22

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值