最簡單的方法就是n中的每個數分別和max,min比較,看似2n次比較,其實大於max的就不必和min比較,小於min的也不必和max比較,因此比較的次數不足2n次,程式如下:
bool maxmin(std::vectorarray, t* max, t* min)
*max = array[0];
*min = array[0];
size_t array_size = array.size();
for (int i = 1; i < array_size; ++i) else if (array[i] < *min)
} return true;
}
其次方法是陣列中的一對一對的數相互比較,比較中較大的乙個和max比較,較小的和min比較,總計有n/2對數,分別和max和min進行一次比較,共計3n/2次比較,程式**如下:
templatebool maxmin_1(std::vectorarray, t* max, t* min)
*max = array[0];
*min = array[0];
int index = 1;
int array_size = array.size();
while(index < array_size && index +1 = array[index + 1])
if (array[index + 1] < *min)
} else
if (array[index] < *min)
}index += 2;
} if (index < array.size())
if (array[index] < *min)
} return true;
}
最後一種方法是分治法,比較次數也是3n/2,程式如下:
templatebool maxmin_2(std::vectorarray, int start, int end, t* max, t* min) else
if (array[start] < *min)
} else
if (array[end] < *min) }}}
templatebool maxmin_3(std::vectorarray, int start, int end, t* max, t* min) else
if (array[start] < *min)
}}
為了測試效能,完成比較程式如下:
#include #include #include #include templatebool maxmin(std::vectorarray, t* max, t* min)
*max = array[0];
*min = array[0];
size_t array_size = array.size();
for (int i = 1; i < array_size; ++i) else if (array[i] < *min)
} return true;
}templatebool maxmin_1(std::vectorarray, t* max, t* min)
*max = array[0];
*min = array[0];
int index = 1;
int array_size = array.size();
while(index < array_size && index +1 = array[index + 1])
if (array[index + 1] < *min)
} else
if (array[index] < *min)
}index += 2;
} if (index < array.size())
if (array[index] < *min)
} return true;
}templatebool maxmin_2(std::vectorarray, int start, int end, t* max, t* min) else
if (array[start] < *min)
} else
if (array[end] < *min) }}}
templatebool maxmin_3(std::vectorarray, int start, int end, t* max, t* min) else
if (array[start] < *min)
}}int gettime()
int main(int argc, char** argv)
printf("\n");
int max;
int min;
int start;
start = gettime();
maxmin(array, &max, &min);
printf("time elapse:%d\n", gettime() - start);
printf("max:%d min:%d\n", max, min);
start = gettime();
maxmin_1(array, &max, &min);
printf("time elapse:%d\n", gettime() - start);
printf("max:%d min:%d\n", max, min);
start = gettime();
maxmin_2(array, 0, array.size() - 1, &max, &min);
printf("time elapse:%d\n", gettime() - start);
printf("max:%d min:%d\n", max, min);
start = gettime();
maxmin_3(array, 0, array.size() - 1, &max, &min);
printf("time elapse:%d\n", gettime() - start);
printf("max:%d min:%d\n", max, min);
}
執行結果:
./a.out
time elapse:187
max:2147469841 min:100669
time elapse:216
max:2147469841 min:100669
time elapse:86513
max:2147469841 min:100669
time elapse:82481
max:2147469841 min:100669
結論:最簡單的方法效率最高,分治法由於迭代效率非常差,這是我想到了分治法的歸併排序,估計效能也不會好,改天比較一下。
程式設計之美 2.10
C 尋找陣列最大值和最小值
c 裡面有好多自帶函式可以直接用,比如尋找陣列中的最大最小值其實是有函式的,如下 include using namespace std include int main cout min element p,p n max element p,p n endl return 0 需要用標頭檔案,m...
js獲取陣列中最大值,最小值
es6拓展運算子.1 math.max arr 最大值 2 math.min arr 最小值 遍歷方法 1 var arr 12,14,34,566,34,98,77 2var max arr 0 3for var i 0 i 7 8 console.log max 最大值9 10for var i...
尋找陣列中的最大值和最小值
問題描述 給出乙個陣列,包含n個整數,那麼需要比較多少次找到最大值和最小值 注意 要想得到最大值和最小值,遍歷一遍陣列是不可避免的。我們能減少的就是減少比較次數來提高效率 方法一 遍歷一遍陣列,同時得到最大值和最小值 具體是,定義乙個max 和 min,每遍歷乙個數,就分別和max 和 min比較一...