题目定义:
给定一个大小为n的数组,无序,找到其中的最大值和最小值,要求元素间的比较次数尽可能少。
这道题出自《算法导论》。创新工场2016校招笔试也考了这道题。
以下摘自《算法导论》:
事实上,我们只需要最多3⌊n/2⌋次比较就可以同时找到最小值和最大值。具体的方法是记录已知的最大值和最小值,然后对输入元素成对地进行处理。首先,我们将一对输入元素相互进行比较,然后把较小的与当前最小值进行比较,把较大的与当前最大值进行比较。这样,对每两个元素共需3次比较。
如何设定已知的最小值和最大值的初始值依赖于n是奇数还是偶数。如果n是奇数,我们就将最小值和最大值的初值都设为第一个元素的值,然后成对地处理余下的元素。如果n是偶数,就对前两个元素做一次比较,以决定最小值和最大值的初值,然后与n是奇数的情形一样,成对地处理余下的元素。
贴一下我的代码:
int min; int max; void findMinMax(int arr[], int n, int &min, int &max) { int begin = 0; if (n % 2 == 1) { min = max = arr[0]; begin = 1; } else { if (arr[0] < arr[1]) { min = arr[0]; max = arr[1]; } else { min = arr[1]; max = arr[0]; } begin = 2; } for (int i = begin; i < n-1; i = i+2) { if (arr[i] < arr[i+1]) { if (arr[i] < min) min = arr[i]; if (arr[i+1] > max) max = arr[i+1]; } else { if (arr[i+1] < min) min = arr[i+1]; if (arr[i] > max) max = arr[i]; } } }