## 【我解C語言面試題系列】012 查找整數數組中第二大的數
**查找整數數組中第二大的數**
題目:寫一個函數找出一個整數數組中,第二大的數。【Mirosoft】
PS:1、” 66,66,66,66,66 ”,則沒有第二大數。
2、” 99,99,88,86,68,66 ”,則最大數是88。
下面我先給出查找最大數字的程序:
~~~
int GetFirstMaxNumber(int buffer[])
{
?? int i,max;
?? max = buffer[0];
?? for(i=1;i<ARRSIZE;i++)
?? {
????? if(buffer[i] > max)
????????? max = buffer[i];
?? }
??
?? return max;
}
~~~
這個算法非常經典,時間復雜度是:O(N)。對于查找一個數組中的最大數字,我們至少要做的就是把數組掃描一遍,能在只掃描數組一遍的情況下就能解決問題的則算法已經是一個不錯的算法的了。
查找第二大的數的算法就是在查找最大數的算法的基礎上實現的,下面給出查找第二大數的程序:
~~~
#define? ARRSIZE???????? ??? 10
#define? MINNUMBER????????? 0xFFFFFFFF
#define? FIND_SUCESS???? ??? 1
#define? FIND_FAIL????????? 0
int GetSecondMaxNumber(int buffer[],int *secondMax)
{
?? int i,max;
?? max = buffer[0];
?? *secondMax = MINNUMBER;
?? for(i=1;i<ARRSIZE;i++)
?? {
????? if(buffer[i] > max)
????? {
?? ??????? *secondMax = max;
????????? max = buffer[i];
????? }
????? elseif (buffer[i] > *secondMax ?&& buffer[i] < max)
????????? ?*secondMax = buffer[i];
?? }
?? if(*secondMax == MINNUMBER) //The numbers are all the same.
????? return FIND_FAIL;
?? return FIND_SUCESS;
}
~~~
查找第二大數實際上是伴隨在查找最大數的過程中的。
1、如果當前元素大于最大數 max,則讓第二大數等于原來的最大數 max,再把當前元素的值賦給 max。
**2、**如果當前的元素大于第二大數secondMax的值而小于最大數max的值,則要把當前元素的值賦給 secondMax。――**判斷條件不能僅僅只是大于第二大的數secondMax,否則我們便無法處理**” 99,99,88,86,68,66 ”**這種情況。**
PS:這個函數在調用時需要判斷函數的返回值是否是 **FIND_SUCESS**才能使用。
?