找最大值和最小值

問題描述:給出一個數組,包含N個整數,那麼需要比較多少次找到最大值和最小值

注意:要想得到最大值和最小值,遍歷一遍數組是不可避免的。我們能減少的就是減少比較次數來提高效率

方法一、遍歷一遍數組,同時得到最大值和最小值

具體是,定義一個max 和 min,每遍歷一個數,就分別和max 和 min比較一次,直到處理完所有的數據

比較次數: N+N = 2N

方法二、我們可以把數組中的數據兩兩分組,分組內找出最大值 和 最小值,之後在最大值的那部分找出最大值,在最小值那部分找出最小值

比較次數:

兩兩比較,較小值放到左邊,較大放右邊,這時比較N/2次

之後,得到的最大值部分是 N/2個數,最小值部分是N/2個數

之後在 最大值部分 取出最大值。比較次數N/2

   在 最小值部分 取出最小值。比較次數N/2

比較次數:1.5N

評價:雖然比較次數下降了,但是破壞了原數組,而且由於在比較過程中有數據的交換,效率還是會拖累的。

方法三、引入倆變量min 和 max,每次也是處理兩個數據,直到所有的數據全部都處理完

具體思路:

引入兩個變量Min 和 Max

取出兩個數,比較一次,得出最大值和最小值

最大值和Max比較,最小值和Min比較,如果比最值還要大或小,則進行更新

比較次數:每處理兩個數,比較3次,則N/2 *3 = 1.5N次

優點,不會破壞原數組,較好

方法四、使用分治算法,其實和方法三是一樣的,分治是一直到兩個數的時候才做,且做完了 把結果合併下就好

思路:在N個數中求最大值和最小值,我們只需求出前後N/2個數的Min和Max,然後取較小的Min,較大的Max即可

比較次數:和方法三一樣,比較次數沒有變化

分析:

f(2) = 1; 

f(n) = 2*f(n/2) + 2; 

 第2個2的意思是:遞歸分成的兩部分求出最值後,還有結合下求出一個整體的最值,這時要有兩次比較 

可以推出f(n) = 1.5*n -2;  可見總的比較次數仍然沒有減少。

擴展題目

找出N個數組中第二大的數,需要比較多少次呢?

是否可以通過類似的分治思想來降低比較次數呢?

方法一、比較笨的方法

先找到本數組中的最大數X,需要n-1次比較,再在剩下的數組中去找最大數X’,需要n-2次比較

則X’就是第二大的數,這需要(n-1) + (n-2)次比較

方法二、我們也可以在數組中,兩數結合,分別求出最大值 和 次大值,之後每兩個數結合求出的最值 在相互比較,得到最值得最大值 和 次大值

具體思路:

把數組中的每兩個元素分爲一組,每組中的最大數爲F,第二大數爲S。

假設相鄰兩組的最大數和第二大數分別是:Fi,Si 和Fj,Sj,。

則這兩組合併爲一組後,其中最大數和第二大數可能是:

1、若Fi > Fj,則最大數是Fi;

     若Si >Fj,則第二大數是Si;否則,第二大數是Fj

2、若Fi< Fj,則最大數是Fj

     若Fi>Sj,則第二大數是Fi;否則,第二大數是Sj

比較次數:共有N/2組,每組需要比較倆次得出本組的最大數和第二大數;共需比較N/2 * 2次。

方法三、分治法

思路:和上面的思路是一樣的

把數組分成兩部分,其最大數和第二大數分別是:Fi,Si,Fj,Sj。合併時的情況可能爲:

1、Fi > Fj,最大數是Fi;若Si>Fj,則第二大數是Si,否則第二大數是Fj;

2、Fi < Fj,最大數是Fj;若Fi>Sj,則第二大數Fi,否則第二大數是Sj。

發佈了44 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章