首页 > 代码库 > 2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]
2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]
【本文链接】
http://www.cnblogs.com/hellogiser/p/find-min-max-of-array.html
【题目】
对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢?
【分析】
1. 遍历两次数组,分别找出最大值和最小值,需要进行 2N 次比较。
2. 将数组中的元素分组,按顺序将数组中相邻的两个数分在同一组,用Max和Min来存储最大值和最小值。同一组比较完之后,较小的数与当前的最小值比较,如该数小于当前最小值,更新Min;较大的数与当前的最大值比较,若该数大于当前最大值,更新Max。Max初始化为数组前两个数中较大值,Min初始化为数组前两个组中较小值。这种方法的比较次数是(N/2)*3=1.5N次。
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | /* version: 1.0 author: hellogiser blog: http://www.cnblogs.com/hellogiser date: 2014/7/10 */ void getMinMax(int a, int b, int *min, int *max) { // compare 1 time if(a > b) { *min = b; *max = a; } else { *min = a; *max = b; } } void findArrMinMax(int a[], int size, int *min, int *max) { if(size == 0) return; if(size == 1) { *min = *max = a[0]; return; } // get min max of a[0] a[1] getMinMax(a[0], a[1], min, max); int i, j; int *tempmin, *tempmax; for(i = 2, j = 3; i < size, j < size; i += 2, j += 2) { // get min max of a[i] a[j] getMinMax(a[i], a[j], tempmin, tempmax); if(*tempmax > *max) *max = *tempmax; if(*tempmin < *min) *min = *tempmin; } // if array size is odd, then the last element a[size-1] is not contained in previous steps,so compare here if(size % 2 != 0) { if(a[size - 1] > *max) *max = a[size - 1]; else if(a[size - 1] < *min) *min = a[size - 1]; } } |
3. 使用分治法,在N个数中求最小值Min和最大值Max,我们只需要求出前后N/2个数的Min和Max,然后取较小的Min和较大的Max即可。设比较的次数为T(n),那么T(n)=2T(n/2)+2,T(1)=0,T(2)=1,这种方法的比较次数是1.5N-2次。
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /* version: 1.0 author: hellogiser blog: http://www.cnblogs.com/hellogiser date: 2014/7/10 */ void findArrMinMax(int a[], int begin, int end, int *min, int *max) { if(end - begin <= 1) { if(a[end] > a[begin]) { *max = a[end]; *min = a[begin]; } else { *max = a[begin]; *min = a[end]; } return; } int maxL, maxR; int minL, minR; int mid = begin + (end - begin) / 2; findArrMinMax(a, begin, mid, &minL, &maxL); findArrMinMax(a, mid + 1, end, &minR, &maxR); *min = minL > minR ? minR : minL; *max = maxL > maxR ? maxL : maxR; } |
【参考】
http://blog.csdn.net/caryaliu/article/details/8135898
http://www.cnblogs.com/lovell-liu/archive/2011/09/07/2169644.html
【本文链接】
http://www.cnblogs.com/hellogiser/p/find-min-max-of-array.html
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。