1. 程式人生 > >設計一個最優演算法來查詢一n個元素陣列中的最大值和最小值

設計一個最優演算法來查詢一n個元素陣列中的最大值和最小值

題目描述

有一個演算法,查詢n個元素的的陣列的最大值和最小值,要比較2n次;請寫一個最高效的演算法,並說明他要比較的次數。請注意複雜度的常數
(不用寫程式碼,說明步驟和過程即可,要定出比較的次數,沒寫不給分)

解題思路

先遍歷一遍陣列,兩個兩個分成一組,小的放在左邊大的放在右邊,這樣比較次數是N/2。N是陣列的長度。然後最小的元素一定是在每組的左邊,最大的元素在右邊。下一步在左邊的所有元素中比較N/2次產生最小的,在右邊的元素中比較N/2次產生最大的。總共需要比較的次數是3*(N/2)次。

實現程式碼

#include <iostream>
#include "limits.h"
using namespace std; int main() { int d[] = {9, 6, 7, 5, 13, 6, 2}; int n = 8; int max = INT_MIN; int min = INT_MAX; bool flag = false; if(n % 2) { n--; flag = true; } for(int i = 0; i < n-1; i+=2) { if(d[i] <= d[i+1]) { if
(d[i] < min) min = d[i]; if(d[i+1] > max) max = d[i+1]; } else { if(d[i] > max) max = d[i]; if(d[i+1] < min) min = d[i+1]; } } //若陣列長度為奇數,還需要和最後一個數作比較 if
(flag) { if(d[n] < min) min = d[n]; if(d[n] > max) max = d[n]; } cout << "The max value of the array is: " << max << endl; cout << "The min value of the array is: " << min << endl; }