一般一开始想到的办法就是一次循环,记录下最大值和最小值。或者就是用两次冒泡,找到最大值和次大值。
这两种方法实践复杂度差不多都是O(2n),如果数组很长,效率还是不够高的。
假如先排序,再选择最大的两个值,这并不是一个好办法,因为我们只需要前两个数有序,不需要后N-2个数有序。
编程的细节要注意,数组a只是个示例,如果有负值,max和second_max的初始化要最小,以免出错。
C++代码如下:
#include<iostream>
using namespace std;
int main()
{
int a[] = {3,9,4,5,1,8,2,6,7,8};
size_t size = sizeof(a) / sizeof(int);
int max = 0;
int second_max = 0;
for (size_t i = 0; i < size; i++)
{
if (a[i] > max)
{
second_max = max;
max = a[i];
}
else if (a[i] > second_max)
{
second_max = a[i];
}
}
cout << "最大的数是:" << max << '\n' \
<< "次最大的数是:" << second_max << endl;
return 0;
}