寻找数组中的第二大数
2011-04-27 10:56
344 查看
前几天得知腾讯招聘测试人员的笔试题中的一道附加题是寻找数组中的第二大数,故考虑其做法,在此在此做一小结。
找数组中的第二大数是一个查找过程,一般返回的应该是第二大数在数组中的位置,但若有其他用途,也可以返回该值
是否找到的标志和它的真值。估有两种做法,但其基本思想都是用一个新数与当前的最大数进行比较,若新数大于最大数,
则新书则成为最大数,最大数退居第二大数;若新数大于当前的第二大数并且新书小于最大数,则新数成为第二大数。
方法一:
返回值为次大数在数组中的位置。
#include <stdio.h>
#include <stdlib.h>
int find_secmax(int data[], int count);
int find_secmax(int data[], int count)
{
int max = 0, secmax = -1;
int i;
for(i = 0; i < count; i++)
{
if(data[i] > data[max])
{
secmax = max;
max = i;
}
else if(data[i] > data[secmax]
&& data[i] < data[max])
{
secmax = i;
}
}
return secmax;
}
void main()
{
int data[5];
int i, second;
printf("/nInput data:");
for(i = 0; i < 5; i++)
{
scanf("%d", data+i);
}
second = find_secmax(data, 5);
printf("%d", second);
}
方法二:
返回是否找到标志和第二大数真值。
#include <stdio.h>
#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)
{
return FIND_FAIL;
}
return FIND_SUCESS;
}
/*主函数*/
void main()
{
int array[ARRSIZE], result, secondMax, i;
printf("请输入数组元素:");
for(i = 0; i < ARRSIZE; i++)
{
scanf("%d", &array[i]);
}
result = GetSecondMaxNumber(array, &secondMax);
if(result = FIND_SUCESS)
{
printf("/n数组中的第二大数为%d", secondMax);
}
}
找数组中的第二大数是一个查找过程,一般返回的应该是第二大数在数组中的位置,但若有其他用途,也可以返回该值
是否找到的标志和它的真值。估有两种做法,但其基本思想都是用一个新数与当前的最大数进行比较,若新数大于最大数,
则新书则成为最大数,最大数退居第二大数;若新数大于当前的第二大数并且新书小于最大数,则新数成为第二大数。
方法一:
返回值为次大数在数组中的位置。
#include <stdio.h>
#include <stdlib.h>
int find_secmax(int data[], int count);
int find_secmax(int data[], int count)
{
int max = 0, secmax = -1;
int i;
for(i = 0; i < count; i++)
{
if(data[i] > data[max])
{
secmax = max;
max = i;
}
else if(data[i] > data[secmax]
&& data[i] < data[max])
{
secmax = i;
}
}
return secmax;
}
void main()
{
int data[5];
int i, second;
printf("/nInput data:");
for(i = 0; i < 5; i++)
{
scanf("%d", data+i);
}
second = find_secmax(data, 5);
printf("%d", second);
}
方法二:
返回是否找到标志和第二大数真值。
#include <stdio.h>
#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)
{
return FIND_FAIL;
}
return FIND_SUCESS;
}
/*主函数*/
void main()
{
int array[ARRSIZE], result, secondMax, i;
printf("请输入数组元素:");
for(i = 0; i < ARRSIZE; i++)
{
scanf("%d", &array[i]);
}
result = GetSecondMaxNumber(array, &secondMax);
if(result = FIND_SUCESS)
{
printf("/n数组中的第二大数为%d", secondMax);
}
}