找第二大的数(分治法)

#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;  
}

解析:

这段代码是用来找出数组中第二大的数的。下面逐行解释代码的功能:

  1.  `void TwoMax(int i, int j, float *fmax2, float *fmax1)`:定义了一个名为TwoMax的函数,用来找出数组中两个最大的数。函数的参数包括起始索引i和结束索引j,以及两个最大数的指针fmax2和fmax1。
  2. . `float lmax2, lmax1, rmax2, rmax1;`:定义了四个浮点数变量,用来存储左半部分和右半部分的两个最大数。
  3. . `if (i == j)`:判断i和j是否相等,如果相等,说明只有一个数,将该数赋给fmax2和fmax1。
  4.  `else if (i == j - 1)`:判断i是否等于j-1,如果是,说明只有两个数,比较两个数的大小,将较大的数赋给fmax1,较小的数赋给fmax2。
  5.  `else`:当i和j不满足上述两个条件时,执行else部分的代码。
  6.  `TwoMax(i, mid, &lmax2, &lmax1);`:递归调用TwoMax函数,找出左半部分的两个最大数。
  7.  `TwoMax(mid + 1, j, &rmax2, &rmax1);`:递归调用TwoMax函数,找出右半部分的两个最大数。
  8.  `if (lmax1 > rmax1)`:比较左半部分的最大数和右半部分的最大数的大小。
  9.  `if (lmax2 > rmax1)`:比较左半部分的第二大数和右半部分的最大数的大小。
  10. . `else`:当lmax2不大于rmax1时,将rmax1赋给fmax2。
  11.  `else`:当lmax1不大于rmax1时,将rmax1赋给fmax1。
  12. . `float second(int n)`:定义了一个名为second的函数,用来调用TwoMax函数并返回第二大的数。

这段代码通过递归的方式,将数组分为两半,并分别找出左半部分和右半部分的两个最大数,然后比较这四个数的大小,得到第二大的数。

 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用分治来解决这个问题,具体步骤如下: 1.将n个数分成两组,分别求出每组中的最大值和次大值; 2.比较两组中的次大值,取其中较大的一个; 3.将较大的次大值所在的组继续使用步骤1和步骤2,直到只有一个数为止,这个数就是第二个最大元素。 下面是用C语言实现的代码: ``` #include <stdio.h> // 返回两个数中较大的一个 int max(int a, int b) { return a > b ? a : b; } // 返回两个数中较小的一个 int min(int a, int b) { return a < b ? a : b; } // 求出数组arr中的最大值和次大值 void maxAndSecondMax(int arr[], int left, int right, int *maxValue, int *secondMaxValue) { if (left == right) { *maxValue = arr[left]; *secondMaxValue = arr[left]; } else if (left + 1 == right) { *maxValue = max(arr[left], arr[right]); *secondMaxValue = min(arr[left], arr[right]); } else { int mid = (left + right) / 2; int leftMax, leftSecondMax, rightMax, rightSecondMax; maxAndSecondMax(arr, left, mid, &leftMax, &leftSecondMax); maxAndSecondMax(arr, mid + 1, right, &rightMax, &rightSecondMax); if (leftMax > rightMax) { *maxValue = leftMax; *secondMaxValue = max(rightMax, leftSecondMax); } else { *maxValue = rightMax; *secondMaxValue = max(leftMax, rightSecondMax); } } } // 求出数组中的第二个最大元素 int secondMax(int arr[], int n) { int maxValue, secondMaxValue; maxAndSecondMax(arr, 0, n - 1, &maxValue, &secondMaxValue); return secondMaxValue; } int main() { int arr[] = {4, 6, 8, 3, 9, 1, 5, 2, 7}; int n = sizeof(arr) / sizeof(int); int result = secondMax(arr, n); printf("第二个最大元素为:%d\n", result); return 0; } ``` 以上代码中,`maxAndSecondMax`函数用来求出数组中的最大值和次大值,`secondMax`函数用来求出第二个最大元素。主函数中,我们定义了一个数组用来测试函数的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值