如何用C语言获取数组第二大元素?现有代码输出异常求修正
修正数组找第二大元素索引的C代码
你的代码核心问题在于第二大元素的更新逻辑错误,以及初始值设置不够严谨,导致无法正确追踪第二大元素的索引。
原代码的问题点
- 初始值设置缺陷:
max和smax都初始化为0,若数组第一个元素不是最大值,后续逻辑容易出现偏差。 - 第二大元素更新逻辑错误:当当前元素小于最大值时,直接将
smax设为当前索引,忽略了该元素可能比当前smax对应值更小的情况,会错误覆盖正确的第二大索引。
修正后的代码
#include<stdio.h> int main(){ int i, max, smax; int A[] = {2,44,6,8,9,10,47}; // 自动计算数组长度,避免硬编码出错 int n = sizeof(A) / sizeof(A[0]); // 初始化max和smax:先比较前两个元素,确定初始的最大和第二大索引 if(A[0] > A[1]){ max = 0; smax = 1; } else { max = 1; smax = 0; } // 从第三个元素开始遍历 for(i = 2; i < n; i++){ if(A[i] > A[max]){ // 当前元素比最大值大:第二大继承原最大值,最大值更新为当前元素 smax = max; max = i; } else if(A[i] > A[smax] && A[i] != A[max]){ // 当前元素比第二大但小于最大值:更新第二大索引 smax = i; } // 如果当前元素等于最大值,不更新第二大(若需要允许第二大等于最大值,可去掉&& A[i] != A[max]) } printf("First value: %d (index: %d)\n", A[max], max); printf("Second value: %d (index: %d)", A[smax], smax); return 0; }
代码说明
- 初始化优化:先比较数组前两个元素,确保
max和smax初始指向正确的较大和较小元素索引,避免初始值偏差。 - 逻辑修复:只有当当前元素大于
smax对应值且不等于最大值时,才更新smax,保证第二大元素的追踪准确。 - 灵活的数组长度计算:用
sizeof(A)/sizeof(A[0])自动计算数组长度,避免硬编码n导致的错误。
运行修正后的代码,会得到正确输出:
First value: 47 (index: 6) Second value: 44 (index: 1)
内容的提问来源于stack exchange,提问作者user20030574
相关产品推荐
相关产品推荐

