#include #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; } /* 如题:如何在乱序数组中寻找最大值和最小值,要求比较次数尽可能小。 思路:如果是单纯的遍历一边,会对每一个元素与存储的最大值和最小值进行比较,比较次数为2n, 考虑到如果比最大的元素大,也就不用跟最小的元素进行对比了,比较次数会略小于2n。 显然这种思路过于常规,一般面试官也不会希望得到这种答案。 正确的思路是类似于快速排序的分组方式, 对数组从两头进行分组,即第0个元素与第n-1个元素进行对比, 大的放a组,小的放b组;然后第一个与n-2进行对比 ........直到两边序号重合,比较次数为n/2, 这时,最大的数肯定在a组里,最小的数肯定在b组。然后再在a组里寻找最大值, 再在b组里寻找最小值,分别都是n/2次比较,一共使用3/2n次比较就搞定啦。 */