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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM