1. 程式人生 > >從陣列中找出最大的兩個數

從陣列中找出最大的兩個數

題目:從陣列區間A[lo, hi]中找出最大的兩個整數A[x1]和A[x2],要求元素比較的次數,要求儘可能的少

迭代版1:

這裡寫圖片描述
如圖所示,當整個掃描一遍陣列A,找出最大的數x1後,再掃描一次陣列剩下的除去x1的元素,演算法程式碼如上圖所示。第一個for迴圈掃描得到x1,第二個和第三個for迴圈掃描得到x2,第一個for迴圈掃描次數為n-1,後兩次掃描n-1-1,所以演算法複雜度O(2n-3)

迭代版2:

這裡寫圖片描述
觀察上一個迭代版1,容易發現在一遍掃描中,可以同時比較x1和x2,這樣就減少了掃描的次數。針對A中的一個元素a,先比較a和x2,如果a > x2,則把a賦值給x2;如果a <= x2,就不需要任何操作。然後再比較x2和x1的大小,如果x2 > x1,則再把x2和x1的值進行交換,如果x2 < = x1,就不需要任何操作。很容易得到演算法的複雜度(比較次數)最好為(n-1),最壞為2n-3

遞迴 + 分治版:

這裡寫圖片描述
如圖所示,這是一種分治策略,把陣列不斷地拆分,它的複雜度在圖中已經寫出來了,注意,圖中寫的是最壞的情況,都不會超過5n/3 - 2,較之上一個演算法(最壞情況下為2n-3),這是有改進的。採用的是遞推方程分析法。圖中提出的進一步優化,思路如下:

程式碼:

這裡寫程式碼片