C语言查找数组最大值与次大值的两种方法
本文介绍如何在C语言中查找数组的最大值和次大值。主要包括通过循环遍历进行比较的逻辑实现,以及从带空格输入的字符串中提取并转换整型数据的技巧。
使用双变量追踪法求解
最直接的方法是设置两个变量分别存储当前遇到的最大值和次大值。但在处理有重复元素的数组时,需要确保这两个值不是同一个实例。下面是一个通过下标跟踪并确保两者不同的逻辑示例:
#include <stdio.h>
int main()
{
int a[] = { 7, 4, 9, 9, 6 };
int len = sizeof(a) / sizeof(int);//求数组元素个数
int max_subscript = 0;//设置最大值下标为0,为数组第一个数
int second_subscript = 1;//设置次大值下标为1,为数组第二个数
while (1)
{
for (int i = 1; i < len; i++)//从下标1(即第二个元素开始遍历)
{
if (max_subscript == i)
{
continue;//跳过原来最大值的下标,直接开始i+1的循环
}
//如果当前的 a[i] 大于已知的最大值
if (a[i]>a[max_subscript])
{
second_subscript = max_subscript;//原最大值变为次大值
max_subscript = i;//新最大值更新
}
else
{
//如果 a[i] 没有超过最大值,但它比次大值大
if (a[i] > a[second_subscript])
{
second_subscript = i;
}
}
}
//判断逻辑:如果最大值和次大值的数值相等,说明未找到真正的次大值
if (a[max_subscript] != a[second_subscript])
{
break; //跳出外层循环
}
a[second_subscript] = 0;//重置次大值以便下一次检测
}
printf("最大值a[max_subscript]=%d,次大值a[second_subscript]=%d\n", a[max_subscript], a[second_subscript]);
printf("最大值下标max_subscript=%d,次大值下标second_subscript=%d\n", max_subscript, second_subscript);
getchar();
return 0;
}
另一种基于单次扫描的思路
除了上述复杂的状态维护外,更常见的做法是在一次完整的遍历中同时更新最大值和次大值。这种方法在处理不同元素时非常高效。
如何处理带空格的输入流
在实际问题中,数据往往以带有空格的字符串形式输入。此时可以先接收字符串,然后将其中的数字提取出来保存到新数组中进行后续计算:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
int main()
{
char oriInput[200] = {0};
int inputInt[100] = {0};
fgets(oriInput,200,stdin);
int len = strlen(oriInput);
int i=0,k=0;
int fimax=0,semax=0;
char *pStart = oriInput;
//将字符串按空格分割并转为整数
for(i=0; i<len; i++)
{
if(oriInput[i] == ' ')
{
oriInput[i] = '\0';
inputInt[k++] = atoi(pStart);
pStart = &oriInput[i+1];
}
}
inputInt[k] = atoi(pStart);
//在此后的逻辑中找最大值和次大值
for(i=0; i<=k; i++)
{
if(fimax < inputInt[i])
fimax = inputInt[i];
}
for(i=0; i<=k; i++)
{
if(semax < inputInt[i] && inputInt[i] != fimax)
semax = inputInt[i];
}
if(fimax == semax)
semax = 0;
printf("%d %d",fimax,semax);
return 0;
}
以上介绍了C语言中数组极值获取的相关技巧,涵盖了从基础逻辑到实际输入处理的完整流程。
以上就是C语言中实现数组几个数求次大值的详细内容,更多关于C语言、数组排序的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













