求数组次大值

在一维整型数组中找出比数组元素最大值小的次大元素的下标,有一个符合条件元素则输出一个下标,有多个符合条件元素则输出多个下标。其中,寻找次大元素下标的函数原型为:int findSecondMax(int *p, const int len);

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
     int a[8]={1,3,8,2,9,5,4,8};  //定义数组
     int i;//定义变量
     int findSecondMax(int *p, const int len);  //函数声明语句
     printf("一维数组中的元素是:");
     for( i=0 ; i<8 ; i++)
     {
          printf("%d ",a[i]);
     }
     printf("\n");
     findSecondMax(a, 8);   //调用函数
     printf("\n");
     system("pause");
     return 0;
}
int findSecondMax(int *p, const int len)    //函数的定义
{
    int i,max,semax,count=0;  //定义最大值和最小值变量
    max=semax=p[0]; 
    for(i=0;i<len;i++)   //通过循环找最大值
    {
        if(max<p[i])
        {
            max=p[i];
        }
    }
    for(i=0;i<len;i++)   //找出次大值
    {
        if((semax<p[i])&&(p[i]<max))
        {
            semax=p[i];
        }
    }
    printf("次大元素(%d)的下标是:",semax);
    for(i=0;i<len;i++)    //利用循环找出次大元素下标 
    {
  
        if(semax==p[i])
        {
            if(count!=0)    
                 printf(",%d",i);  //如果不是第一个次大元素,前面输出一个逗号
           else    
                printf("%d",i);   //如果是第一个次大 元素,原样输出
           count++;  
        }
    }
}


用分治法,先求出左边的最大值leftmax和次大值leftsecond,再求出右边的最大值rightmax和次大值rightsecond,然后合并,如何合并呢?分情况考虑

1 如果leftmax > rightmax,那么可以肯定leftmax是最大值,但次大值不一定是rightmax,但肯定不是rightsecond,只需将leftsecond与rightmax做一次比较即可。

2 如果rightmax > leftmax,那么可以肯定rightmax是最大值,但次大值不一定是leftmax,但肯定不是leftsecond,所以只需将leftmax与rightsecond做一次比较即可。

[html] view plaincopy
  1. // 找出数组的最大值和次大值,a是待查找的数组,left和right是查找区间,max和second存放结果  
  2. void MaxandSec(int a[], int left, int right, int&max, int&second)  
  3. {  
  4.     if(left == right)  
  5.     {  
  6.         max = a[left] ;  
  7.         second =  INT_MIN;  
  8.     }  
  9.     else if(left +1== right)  
  10.     {  
  11.         max = a[left] > a[right] ? a[left] : a[right] ;  
  12.         second = a[left] < a[right] ? a[left] : a[right] ;  
  13.     }  
  14.     else  
  15.     {  
  16.         int mid =(right + left) /2 ;  
  17.   
  18.         int leftmax ;  
  19.         int leftsecond ;  
  20.         MaxandSec(a, left, mid, leftmax, leftsecond) ;  
  21.   
  22.         int rightmax ;  
  23.         int rightsecond ;  
  24.         MaxandSec(a, mid +1, right, rightmax, rightsecond) ;  
  25.   
  26.         if (leftmax > rightmax)  
  27.         {  
  28.             max = leftmax ;  
  29.             second = leftsecond > rightmax ? leftsecond : rightmax ;  
  30.         }  
  31.         else  
  32.         {  
  33.             max = rightmax ;  
  34.             second = leftmax < rightsecond ? rightsecond : leftmax ;  
  35.         }  
  36.     }  
  37. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值