尋找陣列中的最大值和最小值

2021-07-12 02:26:08 字數 1474 閱讀 5493

陣列是最簡單的一種資料結構。我們經常碰到乙個基本的問題,就是尋找整個陣列中的最大數或最小數。我們只需

遍歷一遍陣列,就能找到最大(最小)數。如果同時尋找最大數和最小數呢?對於乙個由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...