码迷,mamicode.com
首页 > 编程语言 > 详细

求数组次大指

时间:2015-02-05 11:26:04      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

在一维整型数组中找出比数组元素最大值小的次大元素的下标,有一个符合条件元素则输出一个下标,有多个符合条件元素则输出多个下标。其中,寻找次大元素下标的函数原型为: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. }  

求数组次大指

标签:

原文地址:http://blog.csdn.net/u014082714/article/details/43524303

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!