C语言之求数组中第二大元素的值

c语言实现分治法求第K大元素(详细解释) 注:本文不对快速排序作任何解释,建议在对快速排序有一定了解后再阅览 一、问题分析 最简单的做法应该是直接选择先将集合排序(比如快速排序),然后直接以k为下标从有序集合中获取。但是这样做时间复杂度其实是比较大的。如果要想要提升一下效率,可以考虑在快速排序的原理下稍微做点修改。 二、修改快排 1、主元素的位置特殊性 在快速排序中,第一步是选取主元素(这里记为x),然后将小于主元素x的数放在x左边,剩下... 阅读详情

一、直接更新

(一)初始化为最小值INT_MIN

在找数组中第二大元素,初始化时可以将最大值与第二大值初始化为int型的最小值INT_MIN,但是需要引入头文件#include <limits.h>。

然后再更新最大值与第二大值:

  • 遍历剩余元素(从 i = 0 开始):

    • 如果 num[i] > max:
      说明发现了新的最大值,原来的 max 降级为 secondMax,更新 max = num[i]。

    • 否则如果 num[i] > secondMax:
      说明当前元素比次大值大(但小于最大值),直接更新 secondMax。

    • 注意:这里不需要考虑 num[i] == max 的情况,因为初始化时已保证二者的值不重复。

#include <stdio.h>
#include <limits.h>

int main() {
    int numbers[5], max, secondMax;

    printf("Enter 5 integers:\n");
    for (int i = 0; i < 5; i++) {
        scanf("%d", &numbers[i]);
    }

    max = secondMax = INT_MIN;
    for (int i = 0; i < 5; i++) {
        if (numbers[i] > max) {
            secondMax = max;
            max = numbers[i];
        } else if (numbers[i] > secondMax && numbers[i] != max ) {
            secondMax = numbers[i];
        }
    }

    printf("Second largest number is: %d\n", secondMax);
    return 0;
}


(二)初始化为数组首元素

如果不想引用头文件时(或者记不住头文件时),可以将max与secondMax初始化为数组中的第一个元素,同时在更新第二大元素值的时候添加条件:(其他不变)

(最大==第二大)&&(当前值最大值): || (max==secondMax && numbers[i]<max)

添加max==secodnMax且大于当前元素这种情况可以避免max与secodnMax同时初始化为数组中最大值,导致后面无法更新secodnMax。

完整代码:

#include <stdio.h>

int main() {
    int numbers[5], max, secondMax;

    printf("Enter 5 integers:\n");
    for (int i = 0; i < 5; i++) {
        scanf("%d", &numbers[i]);
    }

    max = secondMax = numbers[0];
    for (int i = 1; i < 5; i++) {
        if (numbers[i] > max) {
            secondMax = max;
            max = numbers[i];
        } else if ((numbers[i] > secondMax && numbers[i] != max) || (max==secondMax && numbers[i]<max)) {
            secondMax = numbers[i];
        }
    }

    printf("Second largest number is: %d\n", secondMax);
    return 0;
}

三、先去重后更新(麻烦一些)

核心思路:

(一)数组去重

移除所有重复出现的元素,使数组中每个数值只保留一个。

方法

双重循环 + 覆盖删除。

  • 外层循环用 i 固定当前元素。
  • 内层用 while 循环遍历 i 之后的所有元素。
  • 如果发现 num[j] == num[i],说明 j 位置是重复元素:
  1. 将 j 后面的所有元素前移一位(覆盖 num[j])。
  2. 数组有效长度 len 减 1。
  3. j 不增加(因为新的元素移到了 j 位置,需要重新检查)。
            if (num[i] == num[j]){
                // 删除 num[j]
                for (int k = j; k < len - 1; k++){
                    num[k] = num[k + 1];
                }
                len--; // 缩短长度
                // j不增加,继续检查当前位置
            }
  • 如果不相等,则 j++,继续检查下一个位置。
            else{
                j++; // 只有不相等时才移动 j
            }
关键点

删除元素后,j 要回退,确保不会漏掉因前移而进入 j 位置的新元素。

(二)处理去重后的数组

根据去重后的数组长度 len,分情况讨论:

情况 1:len == 1
  • 说明数组中所有元素值都相同(去重后只剩一个)。

  • 没有第二大元素,直接输出提示并结束。

    if (len == 1){
        printf("数组中所有元素相同,无第二大元素");
        return 0;
    }
情况 2:len >= 2
  • 初始化最大值和次大值:

    • 比较 num[0] 和 num[1],较大的赋给 max,较小的赋给 secondMax。

    • 这样初始化的好处是:如果数组只有两个元素,它们就是最终结果,无需进入循环。

        if (num[0] > num[1]) {
            max = num[0];
            secondMax = num[1];
        }
        else {
            max = num[1];
            secondMax = num[0];
        }
  • 遍历剩余元素(从 i = 2 开始):

    • 如果 num[i] > max:
      说明发现了新的最大值,原来的 max 降级为 secondMax,更新 max = num[i]。

    • 否则如果 num[i] > secondMax:
      说明当前元素比次大值大(但小于最大值),直接更新 secondMax。

    • 注意:这里不需要考虑 num[i] == max 的情况,因为去重后已保证所有元素值不重复。

        for (int i = 2; i < len; i++) {
            if (num[i] > max){
                // 新最大值,旧最大值降级为次大
                secondMax = max;
                max = num[i];
            }
            else if (num[i] > secondMax){
                // 比次大大,直接更新次大
                secondMax = num[i];
            }
        }

完整代码如下:

#include <stdio.h>
int main()
{
    int num[8];
    int len = sizeof(num) / sizeof(num[0]);
    int max, secondMax;

    // 1.输入数组
    printf("请输入%d个元素:", len);
    for (int i = 0; i < len; i++){
        scanf("%d", &num[i]);
    }

    // 2.数组去重
    for (int i = 0; i < len - 1; i++){
        int j = i + 1;
        while (j < len){
            if (num[i] == num[j]){
                // 删除 num[j]
                for (int k = j; k < len - 1; k++){
                    num[k] = num[k + 1];
                }
                len--; // 缩短长度
                // j不增加,继续检查当前位置
            }
            else{
                j++; // 只有不相等时才移动 j
            }
        }
    }
    printf("去重后长度len=%d\n", len);

    // 3.根据去重后元素个数分开求解
    //  如果去重后只有一个元素
    if (len == 1){
        printf("数组中所有元素相同,无第二大元素");
        return 0;
    }

    // 去重后有2个及以上
    else{
        // 先初始化,防止两个变量都是最大值
        // 如果去重后只有2个元素则下面初始化为最后结果
        if (num[0] > num[1]) {
            max = num[0];
            secondMax = num[1];
        }
        else {
            max = num[1];
            secondMax = num[0];
        }

        // 如果有2个则不满足for循环条件不执行下面循环,上面初始化为最后结果
        // 如果是2个以上则执行循环更新最大和次大值
        for (int i = 2; i < len; i++) {
            if (num[i] > max){
                // 新最大值,旧最大值降级为次大
                secondMax = max;
                max = num[i];
            }
            else if (num[i] > secondMax){
                // 比次大大,直接更新次大
                secondMax = num[i];
            }
        }
        printf("该数组中第二大元素:%d\n", secondMax);
        return 0;
    }
}

C语言——详解二维数组中元素的地址 在C语言中,二维数组元素的地址认知是一个相对复杂但重要的概念。 阅读详情

相关推荐

【锦标赛算法】找第二大元素FindSecond()

采用锦标赛算法找数组中第二大元素FindSecond()

weixin_52075165的博客 2536

C语言 | 用指向元素的指针变量输出二维数组元素的值

例33:有一个3*4的二维数组,要求用C语言实现指向元素的指针变量输出二维数组个元素的值。 解题思路:二维数组的元素时整型的,它相当于整型变量,可以用int*型指针变量指向它。二维数组的元素在内存中是按行顺序存放的,即存放完序号为0的行中的全部元素后,接着存放序号为1的行中的全部元素,依此类推。 本例是顺序输出数组中各元素之值,比较简单。如果要输出某个指定的数值元素,则应事先计算该元素在数组中的相对位置。 源代码演示: #include<stdio.h>//头文件 int main()//主函

weixin_48669767的博客 6572

C语言 数组中某些元素的和为某一定值 找出所有组合

C语言 数组中某些元素的和为某一定值 找出所有组合 题目:给出如下集合 {19061, 142852, 859322, 122058, 10424, 2274, 2274, 527099, 5723, 6408, 8652, 8652, 50435, 245580, 921051, 734785, 1614292, 617546, 4169671, 125437} 其中某些元素的和6023925...

零一匠铺 3953

c语言 一维数组折半查找法_C程序在一维数组中查找第二大元素

c语言 一维数组折半查找法Problem statement: Write a C program to find second largest element in a one dimensional array. 问题陈述:编写C程序以查找一维数组中的第二大元素。 Example: 例: Input : arr[] = {10, 8, 7, 12, 14, 9} ...

cumubi7552的博客 1359

C语言删除数组中的0元素

编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接收数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。 输入时首先读入数组长度,再依次读入每个元素。 将调用此函数后得到的数组和函数返回值输出。 输入 第一行一个数,表示数组个数 第二行为每个数字,空格分开

北北北 6771

Docker拉取ubuntu22.04镜像使用ROS2 humble及仿真工具可视化进行导航

Docker中安装Ubun22以及ROS,gazebo可视化等

lovebc的博客 1674

求数组中第二大的值

/* 所有c语言代码,都是在LoadRunner中运行; */Action(){   int a[]={12,34,565,23,24,667,89,98};//定义一个int数组;   int len;//记录数组元素个数;   int max;//所求的最大值;   int max_2;//第二大的值;   int i;//循环变量;LoadRunnerg中,不能在for循环中定义变量; ...

weixin_30872733的博客 392

DCM4CHEE Archive Light 应用配置-存储配置

本文介绍了在DICOM归档系统中配置和管理存储的方法,包括通过用户界面和LDAP导入两种方式。主要内容包括: 存储配置概述:用户可根据需求配置单个或多个存储设备,支持在磁盘空间不足或多任务并行时使用。存储分为Archive设备级(序列元数据存储)和Application Entity级(对象存储/元数据存储)。 用户界面操作: 设备级存储配置:通过菜单导航添加/编辑存储描述符,设置Storage ID、URI等关键参数 应用级存储引用:在设备扩展和网络AE中分别配置元数据和对象存储引用 LDAP配置方法:

洪城叮当的博客 1413

不排序在一维数组求出第二大值

【代码】不排序在一维数组求出第二大值。

qq_48123692的博客 361

h5支付不能打开支付宝 ios_iOS支付宝H5支付无法返回APP解决方案

本文前大段在讲楼主是如何解决这个问题的,以及中间遇到的麻烦。赶时间的同学可以直接看最后的 最终解决方案。在讨论之前,我们先看看官方文档上的一句话:注意:在iOS系统中,唤起支付宝App支付完成后,不会自动回到浏览器或商户APP。用户可手工切回到浏览器或商户APP;支付宝H5收银台会自动跳转回商户return_url指定的页面。what? 官方直接跟我们说GG了?楼主不甘心,还是想尝试一下。借鉴之前...

weixin_39864101的博客 850

《AI大模型评测与智能测试》

第三篇“实践蓝图”(第6-7章)着眼于测试领域AI应用,重点介绍了RAG、AI Agent开发及构建端到端智能测试系统的方法。本书聚焦AI时代的“质量”核心,以“AI赋能测试”(AI For Testing)与“AI模型评测”(Testing For AI)为双轮驱动。内容不仅深入剖析如何科学度量AI大模型的内在质量,还系统讲解如何利用AI赋能传统软件测试,帮助读者贯通从模型原理、评测到应用开发的全链路知识。

酌沧 1122

找第二大的数

int [] a = new int[]{2,2,7};  int max = 0;   //最大的  int max2 = 0;  //第二大的  if(a[0] > a[1]){      max = a[0];      max2 = a[1];  }else {      max = a[1];      max2 = a[0];  }    for (int i = 2; i     i

企鹅菜鸟的成长过程 829

iOS WKWebView H5微信支付跳转

iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: 了解WKWebView基本初始化及使用 了解如何利用URL Schemes进行应用间跳转 公司或个人已经在微信后台注册了一级域名 GitHub地址(附代码) :iOS WKWebView H5微信支付跳转 简书地址 :iOS WKWebView H5微信支付跳转 博客地址 :iOS WKWe...

ForeverMyheart的博客 2042

【C语言编程】求数组中第二大的数

一、方法一 #include <stdio.h> #define P 5//数组元素的个数 int main() { int i,max1,max2=0;//定义一个最大值和一个最小值 int tab[P];//定义一个数组 for(i=0;i<P;i++)//输入数组的元素 scanf("%d",&tab[i]); max1=tab[0];//初始化:将数组中的元素值赋给最大值 for(i=0;i<P;i++)//遍历数组中的元素 { //条件判断

大舟舟的博客 1万+

安卓光速虚拟机ADB调试实战:从密钥配置到设备连接

本文详细介绍了在安卓光速虚拟机中进行ADB调试的完整实战流程。核心在于通过密钥配置解决设备未授权问题,并启用网络调试与端口映射,最终实现电脑与虚拟机的稳定连接。文章提供了从原理理解、脚本修改到实战命令和疑难排查的全方位指南,帮助开发者和爱好者高效利用光速虚拟机作为移动测试沙盒。

CAT789的专栏 539

MOS管关断时尖峰电压的5种实用抑制方案(附实测数据对比)

本文针对MOS管关断时产生的尖峰电压问题,提供了五种经过实验室实测验证的实用抑制方案。文章从尖峰电压的成因分析入手,详细阐述了优化PCB布局、设计RC缓冲电路、选用TVS二极管钳位、调节驱动电路以及使用磁珠吸收高频振荡等方法的原理、实施步骤与实测数据对比,为硬件工程师解决开关电源和电机驱动中的过压应力与EMI问题提供了系统性的实战指南。

1226

PTA 数组 7-3 求数组中第二大的元素

无需排序,求数组中第二大的元素。 输入格式: 在一行中输入10个整数,以空格分隔。 输出格式: 直接输出第二大的值。 输入样例: 81 78 80 67 85 42 86 82 90 73 输出样例: 86 代码: #include <stdio.h> int main() { int num[10]; for (int i = 0; i < 10; i++) { scanf("%d", &num[i]); } for (int i = 0; i <

komorebi123_的博客 1万+

【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙

在现代机器人技术的日益发展中,路径规划是使机器人在复杂环境中安全、高效移动的关键部分。其中一个重要的问题是如何划定机器人的禁行区,以确保机器人不会进入危险区域或无法到达的地方。在本文中,我们将探讨一些关键策略,帮助机器人算法工程师更好地划定禁行区。代价地图可以通过多层叠加来实现,一般包括以下几个层级:静态地图层(Static Map Layer):由SLAM(Simultaneous Localization and Mapping)构建的静态地图。该层包含了环境中固定不变的地物信息,如墙壁、家具等。

xiewf的博客 1万+

写一个函数求一个整数数组中第二大元素

/* * SecnodMax.c *写一个函数求一个整数数组中第二大元素 * Created on: 2011-8-14 * Author: yang */ #include int GetSecMax(int * a, int n

热爱C、热爱ARM、热爱Linux 2175

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言求数组长度

前言 C语言对于不同的数据类型的数组求长度方式稍微有不同的地方: 1,对于字符数组求长度 第一种使用strlen() #include<stdio.h> #include<string.h> int main() { char a[10]="dmeo"; printf("%d",strlen(a)); //strlen()检索到\0结束 } 输出: 第二种使用sizeof()来完成 #include<stdio.h> #include<strin

xinzhilinger的博客 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C语言 | 求数组元素之和

题目求数组元素之和代码首先,需要构造一个求和函数。这里求和函数有两种构造方法,一种是迭代法,另一个种是递归法。迭代法求和函数int sum(int a[], int n) { i...

嵌入式大杂烩 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言—数组元素按大小排序

1.方法思想 数组在C语言中即为数据类型相同的一组数,将一组无规则数按大小依次排序并输出,可以采取冒泡排序的思想,所谓冒泡排序就是数字像汽水中的气泡一样总是向某个方向前进,最终到达最终点。 假设我们定义了一组数组,从左到右 a[0] ~ a[9] 共10个数组元素,将a[0]与a[1]对比,如果a[0]大于等于a[1],就将二者的数对换(注意这里是将两者代表的数交换大小,而不是将1和0交换,a[1]和a[0]相当于两个容器,是用来装数字的),这样大的数就处于右边,否则不做...

m0_62475462的博客 3万+

C语言:求数组中第二大的数据

#include <stdio.h> int findSecondNumber(const int arr[], int size) { int BiggestNumber = 0; int SecondNumber = 0; if(size < 2) { printf("ERROR!\n"); return 0; } else { BiggestN...

xikangsoon的博客 2130

【C语言数组经典问题】

C语言数组经典题目

NeferZhangmaowen的博客 2279

详细讲解:C语言删除数组中的某一值的所有元素

具体要求是这样的,通过键盘向程序输入数组中需要删除的数字,程序接到输入后删除数组中所有需要删除的数字。例如: 数组 a[10]={1,2,4,6,4,8,6,2,6,7} 删除数字 :6 输出结果:1 2 4 4 8 2 7 想要实现这个功能,其基本思想其实很简单:检索数组,如果遇到与输入值相同的元素,则删除该元素。至于删除数组中的元素,就只需要把数组从中断处挨个往前移一位就好了。 但数组中要是出现多个相同的数字,就需要我们进行进一步的考虑了,元素的下标问题。 思路如下: 首先使用for循环对数组...

chook_you_too_b的博客 1万+

C语言求3x3数组对角线元素之和

C语言求3x3数组对角线元素之和 #include <stdio.h> int main() { int i, j,sum=0; int a[3][3]; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { scanf_s("%d",&a[i][j]); } } for (i = 0; i ...

liudaoqun的博客 6373
上一篇: C语言学习之数组
下一篇: 常量指针与指针常量
Liuqy-05
博客等级 码龄144天 1粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值