**
問題描述:給出乙個陣列,包含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。
尋找陣列中的最大值和最小值
問題描述 給出乙個陣列,包含n個整數,那麼需要比較多少次找到最大值和最小值 注意 要想得到最大值和最小值,遍歷一遍陣列是不可避免的。我們能減少的就是減少比較次數來提高效率 方法一 遍歷一遍陣列,同時得到最大值和最小值 具體是,定義乙個max 和 min,每遍歷乙個數,就分別和max 和 min比較一...
尋找陣列中的最大值和最小值
如何尋找陣列中的最大值和最小值 維持兩個變數min,max,每次比較相鄰的兩個數,較大者與max比較,較小者與min比較,通過比較找出最值。比較次數為1.5n次。public class maxmin public static void main string args int arr1 null...
尋找陣列中的最大值和最小值
陣列是最簡單的一種資料結構。我們經常碰到乙個基本的問題,就是尋找整個陣列中的最大數或最小數。我們只需 遍歷一遍陣列,就能找到最大 最小 數。如果同時尋找最大數和最小數呢?對於乙個由n個整數組成的陣列,需要比較多少次才能把最大和最小的數找出來呢?解法一 可以把這個問題分解為兩個問題,求最大值和最小值,...