查找整数数组中第二大的数

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

PS1” 66,66,66,66,66 ”,则没有第二大数。

2” 99,99,88,86,68,66 ”,则最大数是88

下面我先给出查找最大数字的程序:

int GetFirstMaxNumber(int buffer[])

{

    int i,max;

 

    max = buffer[0];

    for(i=1;i<ARRSIZE;i++)

    {

       if(buffer[i] > max)

           max = buffer[i];

    }

   

    return max;

}

这个算法非常经典,时间复杂度是:O(N)。对于查找一个数组中的最大数字,我们至少要做的就是把数组扫描一遍,能在只扫描数组一遍的情况下就能解决问题的则算法已经是一个不错的算法的了。

查找第二大的数的算法就是在查找最大数的算法的基础上实现的,下面给出查找第二大数的程序:

 

#define ARRSIZE             10

#define MINNUMBER          0xFFFFFFFF

#define FIND_SUCESS         1

#define FIND_FAIL          0

int GetSecondMaxNumber(int buffer[],int *secondMax)

{

    int i,max;

 

    max = buffer[0];

    *secondMax = MINNUMBER;

    for(i=1;i<ARRSIZE;i++)

    {

       if(buffer[i] > max)

       {

            *secondMax = max;

           max = buffer[i];

       }

       else if (buffer[i] > *secondMax && buffer[i] < max)

           *secondMax = buffer[i];

    }

    if(*secondMax == MINNUMBER) //The numbers are all the same.

       return FIND_FAIL;

 

    return FIND_SUCESS;

}

查找第二大数实际上是伴随在查找最大数的过程中的。

<!--[if !supportLists]-->1、<!--[endif]-->如果当前元素大于最大数 max,则让第二大数等于原来的最大数 max,再把当前元素的值赋给 max。

<!--[if !supportLists]-->2、 <!--[endif]-->如果当前的元素大于第二大数secondMax的值而小于最大数max的值,则要把当前元素的值赋给 secondMax。――判断条件不能仅仅只是大于第二大的数secondMax,否则我们便无法处理” 99,99,88,86,68,66 ”这种情况。

PS:这个函数在调用时需要判断函数的返回值是否是 FIND_SUCESS 才能使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 分治算法可以用来求解一个整数数组的第k大元素。具体步骤如下: 1. 将数组分成两个子数组,左边的子数组包含小于等于间值的元素,右边的子数组包含大于间值的元素。 2. 如果左边的子数组的长度大于等于k,则在左边的子数组继续查找第k大元素。 3. 如果左边的子数组的长度小于k,则在右边的子数组查找第k - 左边子数组长度 - 1大元素。 4. 重复以上步骤,直到找到第k大元素。 这个算法的时间复杂度为O(nlogn),其n为数组的长度。 ### 回答2: 分治算法是一种经典的算法思想,通过将一个问题分解成若干个小问题,并分别解决,最后合并结果得到整个问题的解决方案。对于整数数组的第k大元素的问题,我们可以运用分治算法进行求解。 具体的方法如下: 1. 随机选择数组的一个数作为枢轴值(pivot),将数组小于枢轴值的数放在它左边,大于它的数放在它右边。 2. 计算出枢轴值在数组的位置 p (第 p 大元素)。 a. 如果 p == k,则找到了第 k 大元素,返回它的值。 b. 如果 p > k,则在枢轴值的左边继续查找第 k 大元素。 c. 如果 p < k,则在枢轴值的右边继续查找第 k-p 大元素。 3. 当在步骤2找到了第 k 大元素时,返回它的值。 4. 当在步骤2未能找到第 k 大元素时,重复执行步骤1-3。 由于每一次都将数组分成了两个部分,所以每一次查找的时间复杂度为 O(n),因此总时间复杂度为 O(n log n)。 需要注意的是,为了防止出现最坏情况,需随机选择枢轴值,或者通过一定的方法选择每次划分的方向(例如:选择位数作为枢轴值),防止过多的元素分到一边,导致时间复杂度退化。 总之,利用分治算法求解整数数组第 k 大元素是一种高效的方法,其时间复杂度为 O(n log n),是解决这一问题的常用方法。 ### 回答3: 分治算法将问题分成小的子问题,然后将这些子问题的解合并成原问题的解。求一个整数数组的第k大元素就可以使用分治算法来求解。 首先选择一个pivot元素,将数组分成两部分,一部分比pivot元素小,一部分比pivot元素大。如果这个pivot元素是第k大的元素,那么问题就得到了解决。 如果pivot元素不是第k大的元素,那么问题就被拆分成了两个子问题,分别对这两个子问题进行递归操作即可。只需要递归子数组可能存在第k大元素的那一部分。 快速选择算法采用的就是这种思路,可以快速地找到第k大元素。反复进行快速选择操作,直到找到第k大的元素为止。 快速选择算法的时间复杂度为O(n),其n为数组的长度。由于每次操作只需要递归一个子问题,所以算法的空间复杂度为O(log n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值