設計一個最優演算法來查詢一n個元素陣列中的最大值和最小值
阿新 • • 發佈:2019-02-17
題目描述
有一個演算法,查詢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;
}