利用分治法求一组数据中最大的两个数和最小的两个数

来源:互联网 发布:转基因知乎 编辑:程序博客网 时间:2024/05/06 08:28

利用分治法求一组数据中最大的两个数和最小的两个数。

#define M 10

#include<stdio.h>

int a[]={3,6,0,7,8,20,16,24,10,18};

void maxtwo(int,int,int*,int*);

void mintwo(int,int,int*,int*);

void main()

{      int max1,max2,min1,min2;

maxtwo(0,M-1,&max1,&max2);

printf("The max two elements:%d  %d\n",max1,max2);

mintwo(0,M-1,&min1,&min2);

printf("The min two elements:%d  %d\n",min1,min2);  }

void maxtwo(int i,int j,int *max1,int *max2)

{      int lmax1,lmax2,rmax1,rmax2;

int mid;

if(i==j) {*max1=a[i];*max2=a[i];}

else if (i==j-2)

{      if (a[i]>=a[i+1]&&a[i+1]>=a[i+2])

{*max1=a[i];    *max2=a[i+1];}

else if (a[i]>=a[i+2]&&a[i+2]>=a[i+1])

{*max1=a[i];    *max2=a[i+2];}

else if (a[i+1]>=a[i]&&a[i]>=a[i+2])

{*max1=a[i+1];  *max2=a[i];}

else if (a[i+1]>=a[i+2]&&a[i+2]>=a[i])

{*max1=a[i+1];  *max2=a[i+2];}

else if (a[i+2]>=a[i]&&a[i]>=a[i+1])

{*max1=a[i+2];    *max2=a[i];}

    else{*max1=a[i+2];    *max2=a[i+1];}    }

else

{ mid=(i+j)/2;

maxtwo(i,mid,&lmax1,&lmax2);

maxtwo(mid+1,j,&rmax1,&rmax2);

if(lmax1>=rmax1)

{ *max1=lmax1;

  if (lmax2>=rmax2)  *max2=lmax2;

  else               *max2=rmax1;    }

else

{*max1=rmax1;

 if (rmax2>=lmax2)  *max2=rmax2;

 else               *max2=lmax1;   }    }   }

void mintwo(int i,int j,int* min1,int* min2)

{ int lmin1,lmin2,rmin1,rmin2;

int mid;

if(i==j) {*min1=a[i];*min2=a[i];}

else if(i==j-2)

{ if (a[i]<=a[i+1]&&a[i+1]<=a[i+2])

{*min1=a[i];    *min2=a[i+1];}

else if (a[i]<=a[i+2]&&a[i+2]<=a[i+1])

{*min1=a[i];    *min2=a[i+2];}

else if (a[i+1]<=a[i]&&a[i]<=a[i+2])

{*min1=a[i+1];  *min2=a[i];}

else if (a[i+1]<=a[i+2]&&a[i+2]<=a[i])

{*min1=a[i+1];  *min2=a[i+2];}

else if (a[i+2]<=a[i]&&a[i]<=a[i+1])

{*min1=a[i+2];   *min2=a[i];}

else{*min1=a[i+2];    *min2=a[i+1];}    }

else{ mid=(i+j)/2;

mintwo(i,mid,&lmin1,&lmin2);

mintwo(mid+1,j,&rmin1,&rmin2);

if(lmin1<=rmin1)

{*min1=lmin1;

if (lmin2<=rmin2)  *min2=lmin2;

else               *min2=rmin1;     }

else{*min1=rmin1;

if (rmin2<=lmin2)  *min2=rmin2;

else               *min2=lmin1;   }   }    }

原创粉丝点击