从数组区间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)
Θ(2n−3)
方法二:
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)=2∗T(n/2)+2<=5n/2−2