利用分治法求一组数据中最大的两个数和最小的两个数
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; } } }
#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; } } }
相关文章推荐
- 分治法:求一组数据中最大的两个数和最小的两个数
- 分治法:求一组数据中最大的两个数和最小的两个数
- [BUC-2.10]利用分治的思想求无序数组中的最大值和最小值以及求第二大的值(分治的思想可以使得比较的次数1.5N-2)
- java 获取一组数据中的最大值和最小值
- c语言利用指针求一组数的最大值,最小值。平均值
- 利用excel的数据透视快速分析数据(求每项的最大值、最小值、求和)
- 在圆圈中,把相隔一个数据的两个数 称作一对数,编写算法求出乘积最大的一对数和乘积最小的一对数
- 利用位运算计算某种数据类型的最大值和最小值
- [SQL]一组数据中Name列相同值的最大Je与最小je的差
- 通过循环找出一组数据的最大值和最小值的小技巧
- java从键盘输入一组数据,输出其最大值,平均值,最小值没法输出
- 最简单的获取一组数据中的最大和最小数
- JAVA 输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。
- R语言如何一次输出一组数据的最大值,最小值,平均值(如何一次完成多个函数)
- (使用STL自带的排序功能进行排序7.3.12)UVA 11057 Exact Sum(在一组数据中找到这么两个数,使得他们的和等于指定数&&且这两个数之间的差值最小)
- 在一组数据中获取最大值,最小值,平均值的js写法
- 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
- 输入一组整数,找出这组数中最大值与最小值的下标,在主调函数中输出最大值和最小值,用指针实现。
- 利用Matlab画一组数据不同颜色的条形图(Bar)
- 【数据结构与算法C】利用两个栈S1S2模拟一个队列,用栈的基本操作实线EnQueue,DeQueue,QueueEmpty