求陣列最大最小值 阿里2013校招題目

2021-06-25 16:40:50 字數 705 閱讀 2547

題目:

設計乙個最優演算法來查詢一n個元素陣列中的最大值和最小值。已知一種需要比較2n次的方法,請給乙個更優的演算法。請特別注意優化時間複雜度的常數。

分析:直觀解法:分別求解最大最小值,各需要比較n-1次,因此總比較次數約為2n次,也即題目中所述已知的方法。

優化解法:能優化的原因是聯合求解最大最小值,可以減小比較次數,最直觀的例子就是,如果比較到某個數比現有最大值更大則不用比較其是否是最小值。但這種方式效能沒有保障(例如最大值出現在第乙個位置)。要想得到穩定的優化,可以考慮先比較待比較的兩個數,這樣可以得到乙個偏序的結果,進而保證了演算法穩定性。一種實現方法是:將陣列兩兩分組,每個二元組中的兩個數先比較大小,然後較大的數和當前記錄的max比較、較小的數和當前記錄的min比較。複雜度為:二元組的比較n/2次,加上和max、min分別比較的n/2次,總計1.5n次,係數得以優化。注意二元組的比較是不需要交換位置的,否則將破壞原陣列的結構且帶來額外的複雜度;當陣列大小為奇數時,兩兩分組將多出乙個元素,**實現很容易處理這種情況。

#include

void find_max_min(int* a, int n)else

}printf("max:%d\tmin:%d\n", max, min);

}void main();

int a[10] = ;

find_max_min(a, 9);

}

求陣列的最大值最小值

演算法陣列中的最大值和最小值 方法1 遍歷兩次求出最大值最小值 時間複雜度n 2 方法2 相鄰兩個數分為一組比較,大的放在偶數字,小的放到奇數字,然後在偶數字上找到最大值,在奇數字上找到最小值n 1.5 方法3 定義兩個變數max,min值,相鄰兩個數分為一組,比較出最大值和最小值,最大值和max比...

分治法求陣列最大最小值

常規的做法是遍歷一次,分別求出最大值和最小值,但我這裡要說的是分治法 divide and couquer 將陣列分成左右兩部分,先求出左半部份的最大值和最小值,再求出右半部份的最大值和最小值,然後綜合起來求總體的最大值及最小值。這是個遞迴過程,對於劃分後的左右兩部分,同樣重複這個過程,直到劃分區間...

求陣列的最大值與最小值

方法1 通過迴圈查詢陣列的最大值和最小值 minn a 0 maxx a 0 for int j 0 j i j 方法2 利用c 自帶的函式 max element 和 min element include include using namespace std intmain cout max ...