牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

查找数组中第二大的数值

题目:写一个函数找出一个整数数组中,第二大的数。【Mirosoft

解答:
int FindSecondMaxValue(int src[], int count)
{
    
int max = 0;
    
int secondMax = 0;

    
if (count==0return secondMax;
    
if (count==1)
    
{
        
return src[0];
    }

    
else if (src[0> src[1])
    
{
        max 
= src[0];
        secondMax 
= src[1];
    }

    
else
    
{
        max 
= src[1];
        secondMax 
= src[0];
    }


    
for (int i=2; i<count; ++i)
    
{
        
if (src[i] >= max)
        
{
            secondMax 
= max;
            max 
= src[i];
        }

        
else
        
{
            
if (src[i]>secondMax)
            
{
                secondMax 
= src[i];
            }

        }

    }

    
return secondMax;
}

算法本身是简单的,但是一些边界条件需要注意:
1.数组的元素数量为1,0个;
2.数组所有元素的数值相等;
3.数组元素只有2个不同的数值。

以上代码还不是很健壮,不过基本逻辑应该是OK的,以下是测试代码,测试了相关的边界条件。
void testFindSecondMaxValue()
{
    
const int array_size = 10;

    
// 一般情况
    int arr1[array_size]={0-1187335424-56355687-100};
    std::cout 
<< "数组中第二大数为:" << FindSecondMaxValue(arr1, array_size ) << std::endl;

    
// 数组元素只有2个不同的数值
    int arr2[array_size]={0100000000};
    std::cout 
<< "数组中第二大数为:" << FindSecondMaxValue(arr2, array_size ) << std::endl;

    
// 数组所有元素的数值相等
    int arr3[array_size]={1111111111};
    std::cout 
<< "数组中第二大数为:" << FindSecondMaxValue(arr3, array_size ) << std::endl;

    
// 只有0个元素的数组
    
//int arr4[0];
    
//std::cout << "数组中第二大数为:" << FindSecondMaxValue(arr4, 0 ) << std::endl;

    
// 只有1个元素的数组
    int arr5[1]={1};
    std::cout 
<< "数组中第二大数为:" << FindSecondMaxValue(arr5, 1 ) << std::endl;

}
不过0数组在VS2005里面已经被禁止掉了,所以arr4编译是会要报错的。


附送一个求数组第二小的元素的查找算法:
int FindSecondMinValue(int src[], int count)
{
    
int min = 0;
    
int secondMin = 0;

    
if (count==0return secondMin;
    
if (count==1)
    
{
        
return src[0];
    }

    
else if (src[0< src[1])
    
{
        min 
= src[0];
        secondMin 
= src[1];
    }

    
else
    
{
        min 
= src[1];
        secondMin 
= src[0];
    }


    
for (int i=2; i<count; ++i)
    
{
        
if ( src[i]<=min )
        
{
            secondMin 
= min;
            min 
= src[i];
        }

        
else
        
{
            
if ( src[i] < secondMin)
                secondMin 
= src[i];
        }

    }

    
return secondMin;
}
其实就是反了一下,也没啥特别的。。。。
=。=

posted on 2009-01-06 05:32 杨粼波 阅读(1197) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理