#include<stdio.h>
float a[100];
void TwoMax(int i,int j,float *fmax2,float *fmax1){
float lmax2,lmax1,rmax2,rmax1;
int mid;
if(i==j){
*fmax1=*fmax2=a[i];
} else if(i=j-1){
if(a[i]>a[j]){
*fmax1=a[i];
*fmax2=a[j];
} else{
*fmax1=a[j];
*fmax2=a[i];
}
}else{
mid=(i+j)/2;
TwoMax(i,mid,&lmax2,&lmax1);
TwoMax(mid+1,j,&rmax2,&rmax1);
if(lmax1>rmax1){
if(lmax2>rmax2){
*fmax1=lmax1;
*fmax2=lmax2;
}else
{
*fmax1=lmax1;
*fmax2=rmax1;
}
}else{
if(rmax2>lmax2){
*fmax1=rmax1;
*fmax2=rmax2;
}else{
*fmax1=rmax1;
*fmax2=lmax1;
}
}
}
}
float second(int n){
float max2,max1;
TwoMax(0,n-1,&max2,&max1);
return max2;
}
int main(){
int n, i;
float max2;
printf("请输入数组长度:");
scanf("%d", &n);
printf("请依次输入数组的数:");
for (i = 0; i < n; i++) {
scanf("%f", &a[i]);
}
max2=second(n);
printf("第二大的数为:%.0f\n", max2);
return 0;
}
解析:
这段代码是用来找出数组中第二大的数的。下面逐行解释代码的功能:
- `void TwoMax(int i, int j, float *fmax2, float *fmax1)`:定义了一个名为TwoMax的函数,用来找出数组中两个最大的数。函数的参数包括起始索引i和结束索引j,以及两个最大数的指针fmax2和fmax1。
- . `float lmax2, lmax1, rmax2, rmax1;`:定义了四个浮点数变量,用来存储左半部分和右半部分的两个最大数。
- . `if (i == j)`:判断i和j是否相等,如果相等,说明只有一个数,将该数赋给fmax2和fmax1。
- `else if (i == j - 1)`:判断i是否等于j-1,如果是,说明只有两个数,比较两个数的大小,将较大的数赋给fmax1,较小的数赋给fmax2。
- `else`:当i和j不满足上述两个条件时,执行else部分的代码。
- `TwoMax(i, mid, &lmax2, &lmax1);`:递归调用TwoMax函数,找出左半部分的两个最大数。
- `TwoMax(mid + 1, j, &rmax2, &rmax1);`:递归调用TwoMax函数,找出右半部分的两个最大数。
- `if (lmax1 > rmax1)`:比较左半部分的最大数和右半部分的最大数的大小。
- `if (lmax2 > rmax1)`:比较左半部分的第二大数和右半部分的最大数的大小。
- . `else`:当lmax2不大于rmax1时,将rmax1赋给fmax2。
- `else`:当lmax1不大于rmax1时,将rmax1赋给fmax1。
- . `float second(int n)`:定义了一个名为second的函数,用来调用TwoMax函数并返回第二大的数。
这段代码通过递归的方式,将数组分为两半,并分别找出左半部分和右半部分的两个最大数,然后比较这四个数的大小,得到第二大的数。