C语言查找数组最大值与次大值的两种方法

落日邮差
落日邮差
发布时间:2026-10-15 | 3人浏览过
原创

本文介绍如何在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语言、数组排序的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表