陣列是最簡單的一種資料結構。我們經常碰到乙個基本的問題,就是尋找整個陣列中的最大數或最小數。我們只需遍歷一遍陣列,就能找到最大(最小)數。如果同時尋找最大數和最小數呢?對於乙個由n個整數組成的陣列,需要比較多少次才能把最大和最小的數找出來呢?
解法一:
可以把這個問題分解為兩個問題,求最大值和最小值,我們可以遍歷兩邊陣列,第一遍求最大值,第二遍求最小值,時間複雜度為o(2*n)。
解法二:
我們可以在概念上把陣列中相鄰的兩個元素分為一組,然後比較這兩個元素,較大者和max比較,如果大於max則更新max,較小者和min比較,小於min則更新min。演算法的時間複雜度為o(1.5*n)。例如:
實現**:
void find_max_min(int *a, int length, int *max, int *min)
/*初始化max和min*/
*max = a[0] > a[1] ? a[0] : a[1];
*min = a[0] > a[1] ? a[1] : a[0];
int i;
int n;
if (length % 2)
n = length - 1;
else
n = length;
for (i = 2; i < n;i+=2)
else
}/*如果length為奇數,則剩下最後乙個元素沒有做過比較*/
if (i < length)
}
解法三:分治思想是解決問題常用的一種技巧。我們可以先求出前n/2個數的max和min,然後求出後n/2個數的max和min,取較大的max和較小的min即可。演算法時間複雜度為o(1.5*n)。
void find_max_min(int *a, int satrt, int end,int *max, int *min)
else
return;
} int left_max, left_min, right_max, right_min;
int mid = (satrt + end) / 2;
find_max_min(a, satrt, mid, &left_max, &left_min);
find_max_min(a, mid + 1, end, &right_max, &right_min);
*max = left_max > right_max ? left_max : right_max;
*min = left_min > right_min ? right_min : left_min;
}}
尋找陣列中的最大值和最小值
問題描述 給出乙個陣列,包含n個整數,那麼需要比較多少次找到最大值和最小值 注意 要想得到最大值和最小值,遍歷一遍陣列是不可避免的。我們能減少的就是減少比較次數來提高效率 方法一 遍歷一遍陣列,同時得到最大值和最小值 具體是,定義乙個max 和 min,每遍歷乙個數,就分別和max 和 min比較一...
尋找陣列中的最大值和最小值
如何尋找陣列中的最大值和最小值 維持兩個變數min,max,每次比較相鄰的兩個數,較大者與max比較,較小者與min比較,通過比較找出最值。比較次數為1.5n次。public class maxmin public static void main string args int arr1 null...
尋找陣列中最大值和最小值
最簡單的方法就是n中的每個數分別和max,min比較,看似2n次比較,其實大於max的就不必和min比較,小於min的也不必和max比較,因此比較的次數不足2n次,程式如下 bool maxmin std vectorarray,t max,t min max array 0 min array 0...