【正确答案】
【答案解析】如果仅仅只考虑实现,而不考虑时间效率,可以首先通过排序算法,将数组进行排序,然后根据数据下标来访问数组中第二大的数,最快的排序算法一般为快速排序算法,但是其时间复杂度仍然为O(nlogn),根据下标访问需要遍历一遍数组,时间复杂度为O(n),所以总的时间复杂度为O(nlogn)。
有没有更好的方法能将时间复杂度降低呢?答案是肯定的,可以只通过一遍扫描数组即可找出数组中第二大的数,即通过设置两个变量来进行判断。首先定义一个变量来存储数组的最大数,初始值为数组首元素;另一个变量用来存储数组元素的第二大数,初始值为最小负整数-32767,然后遍历数组元素。如果数组元素的值比最大数变量的值大,则将第二大变量的值更新为最大数变量的值,最大数变量的值更新为该元素的值;如果数组元素的值比最大数的值小,则判断该数组元素的值是否比第二大数的值大,如果大,则更新第二大数的值为该数组元素的值。
程序代码示例如下:
#include<stdio.h>
const int MINNUMBER=-32767;
int FindSecMax(int data[],int count)
{
int maxnumber=data[0];
int sec_max=MINNUMBER;
for (int i=1;i<count;i++)
{
if(data[i]>maxnumber)
{
sec_max=maxnumber;
maxnumber=data[i];
}
else
{
if(data[i]>sec_max)
sec_max=data[i];
}
}
return sec_max;
}
int main()
}
int array[]={2,5,6,7,7,8,98,3,458,5,6};
int length=sizeof(array)/sizeof(array[0]);
printf("%d/n",FindSecMax(array,length));
return 0;
}
程序的输出结果:
98