解题思路:二分法,保留每个子问题的最小的两个数和最大的两个数
方案一:
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
float a[100];
float max1, max2, min1, min2; //min1<min2, min1保存最小的数, min2 保存次小数; max2<max1, max1保存最大数, max2保存次大数
void min_maxtwo (int i, int j, float &fmin2, float &fmin1, float &fmax2, float &fmax1) //fmin1存放最小的数,fmin2存放次小的数
{
float lmin2, lmin1, rmin2, rmin1, lmax2, lmax1, rmax2, rmax1;
int mid;
if (i==j)
{
fmin2=fmin1=a[i];
fmax2=fmax1=a[i];
}
else if (i==j-1)
if (a[i]<a[j])
{ fmax1=fmin2=a[j]; fmax2=fmin1=a[i];}
else
{ fmax1=fmin2=a[i]; fmax2=fmin1=a[j]; }
else
{
mid=(i+j)/2;
min_maxtwo (i, mid, lmin2, lmin1, lmax2, lmax1);
min_maxtwo (mid+1, j, rmin2, rmin1, rmax2, rmax1);
//以下求最小的两个数
if (lmin1<rmin1)
if(lmin2<rmin1)
{ fmin1=lmin1; fmin2=lmin2; }
else
{ fmin1=lmin1; fmin2=rmin1;}
else
{
if (rmin2<lmin1)
{ fmin1=rmin1; fmin2=rmin2; }
else
{ fmin1=rmin1; fmin2=lmin1;}
}
//**********%%%%%%&&&&&&&&&&&
//以下求最大的两个数
if (lmax1<rmax1)
if(lmax1<rmax2)
{ fmax1=rmax1; fmax2=rmax2; }
else
{ fmax1=rmax1; fmax2=lmax1;}
else //lmax1>rmax1
{
if (lmax2<rmax1)
{ fmax1=lmax1; fmax2=rmax1; }
else
{ fmax1=lmax1; fmax2=lmax2;}
}
}
}
//float second (int n)
//{
// //float min2, min1;
// two(0, n-1, min2, min1);
// printf("min1=%.2f, min2=%.2f", min1, min2);
//}
void second (int n)
{
//float min2, min1;
min_maxtwo(0, n-1, min2, min1, max2, max1);
//printf("min1=%.2f, min2=%.2f", min1, min2);
}
int main( )
{
int i, n=8;
// float max1, max2, min1, min2;
printf("请输入一组数:\n");
for (i=0;i<n;i++)
scanf("%f", &a[i]);
second(n);
printf("%f, %f, %f, %f\n", min1, min2, max2, max1);
system ("pause");
return 0;
}
运行结果:
请输入一组数:
1 2 -3 4 6 10 20 -11
-11.000000, -3.000000, 10.000000, 20.000000
请按任意键继续. . .
方案二:
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
float a[100];
float max1, max2, min1, min2; //min1<min2, min1保存最小的数, min2 保存次小数; max2<max1, max1保存最大数, max2保存次大数
void mintwo (int i, int j, float &fmin2, float &fmin1) //fmin1存放最小的数,fmin2存放次小的数
{
float lmin2, lmin1, rmin2, rmin1;
int mid;
if (i==j)
{ fmin2=fmin1=a[i]; }
else if (i==j-1)
if (a[i]<a[j])
{ fmin2=a[j]; fmin1=a[i];}
else
{ fmin2=a[i]; fmin1=a[j]; }
else
{
mid=(i+j)/2;
mintwo (i, mid, lmin2, lmin1);
mintwo (mid+1, j, rmin2, rmin1);
if (lmin1<rmin1)
if(lmin2<rmin1)
{ fmin1=lmin1; fmin2=lmin2; }
else
{ fmin1=lmin1; fmin2=rmin1;}
else
{
if (rmin2<lmin1)
{ fmin1=rmin1; fmin2=rmin2; }
else
{ fmin1=rmin1; fmin2=lmin1;}
}
}
}
void maxtwo (int i, int j, float &fmax2, float &fmax1) //fmax1存放最大的数,fmax2存放次大的数
{
float lmax2, lmax1, rmax2, rmax1;
int mid;
if (i==j) { fmax2=fmax1=a[i]; }
else if (i==j-1)
if (a[i]<a[j])
{ fmax1=a[j]; fmax2=a[i];}
else
{ fmax1=a[i]; fmax2=a[j]; }
else
{
mid=(i+j)/2;
maxtwo (i, mid, lmax2, lmax1);
maxtwo (mid+1, j, rmax2, rmax1);
if (lmax1<rmax1)
if(lmax1<rmax2)
{ fmax1=rmax1; fmax2=rmax2; }
else
{ fmax1=rmax1; fmax2=lmax1;}
else //lmax1>rmax1
{
if (lmax2<rmax1)
{ fmax1=lmax1; fmax2=rmax1; }
else
{ fmax1=lmax1; fmax2=lmax2;}
}
}
}
void second (int n)
{ mintwo(0, n-1, min2, min1);
maxtwo(0, n-1, max2, max1);
}
int main( )
{
int i, n=8;
printf("请输入一组数:\n");
for (i=0;i<n;i++)
scanf("%f", &a[i]);
second(n);
printf("%f, %f, %f, %f\n", min1, min2, max2, max1);
system ("pause");
return 0;
}