【本文鏈接】
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