您的位置:首页 > 其它

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

2012-06-25 22:37 766 查看
利用分治法求一组数据中最大的两个数和最小的两个数。

#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; } } }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐