题目:如何找出一个数组中第二大的数。
分析:如果仅仅只考虑实现,而不考虑时间效率,可以首先通过排序算法,将数组进行排序,然后根据数据下标来访问数组中第二大的数。最快的排序算法一般为快速排序算法,但是其时间复杂度仍然为O(nlogn),根据下标访问需要遍历一遍数组,时间复杂度为O(n),所以总的时间复杂度为O(nlogn)。
如何只通过一遍扫描数组即可找出数组中第二大的数?
方法:通过设置两个变量来进行判断。
(1)首先定义一个变量来存储数组的最大数,初始值为数组首元素;另一个变量用来存储数组元素的第二大数,初始值为最小负数 -32767,然后遍历数组元素。
(2)如果数组元素的值比最大数变量的值大,则将第二大变量的值更新为最大数变量的值,最大数变量的值更新为该元素的值;如果数组元素的值比最大数的值小,则判断该数组元素的值是否比第二大数的值大,如果大,则更新第二大数的值为该数组元素的值。
具体实现如下:
#include <iostream>
int FindSecMax(int arr[], int len)
{
int sec_Max = -32767;
int Max = arr[0];
for (int i = 1; i < len; i++)
{
if (arr[i] > Max)
{
sec_Max = Max;
Max = arr[i];
}
else
{
if (arr[i] > sec_Max)
sec_Max = arr[i];
}
}
return sec_Max;
}
int main(int argc, const char * argv[]) {
int arr[] = {1,2,6,7,3,4,9,5,8};
int len = sizeof(arr)/sizeof(int);
printf("第二大的数为 %d\n", FindSecMax(arr, len));
return 0;
}