/*****************************************************************
*求数组中第二大数:
(1)先排序,再找第二大数,复杂度O(n^2)
(2)设置两个变量分别存储最大数和第二大数,遍历数组更新两变量, 复杂度O(n)
(3)考虑到效率问题,使用二分法,复杂度O(log n)
******************************************************************/
#include <stdio.h>
//函数声明
void search1(int * , int , int * , int *);
void search2(int * , int , int * , int *);
void search3(int * , int * , int * , int *);
//主函数
int main()
{
int a[10] = {100,34,6,23,44,21,43,21,11,67};
int max1, max2;
search1(a, 10, &max1, &max2);
printf("max1 = %d, max2 = %d\n",max1 ,max2);
search2(a, 10, &max1, &max2);
printf("max1 = %d, max2 = %d\n",max1 ,max2);
search3(a, a + 9, &max1, &max2);
printf("max1 = %d, max2 = %d\n",max1 ,max2);
return 0;
}
void search1(int *a, int length, int *max1, int *max2)
{
int i,j,k,temp;
for(i = 0; i < 2; i++)// 选择法排序,由于只需找到第二大数,外循环两次即可
{
k = i;
for(j = i + 1; j < length; j++)
{
if(*(a + k) < *(a + j))
k = j;
}
if(k != i)
{
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
*max1 = a[0];
*max2 = a[1];
}
}
void search2(int *a, int length, int *max1, int *max2)
{
int i;
if(*a > *(a + 1))
{
*max1 = *a;
*max2 = *(a + 1);
}
else
{
*max2 = *a;
*max1 = *(a + 1);
}
for(i = 2; i < length; i++)
{
if(*(a + i) > *max1)
{
*max2 = *max1;
*max1 = *(a + i);
}
else if(*(a + i) < *max2);
else
*max2 = *(a + i);
}
}
void search3(int *begin, int *end, int *max1, int *max2)
{
int *middle = begin + (end - begin) / 2;
int lmax1, lmax2, rmax1, rmax2;
if(end - begin == 1)
{
if(*begin >= *end)
{
*max1 = *begin;
*max2 = *end;
}
else
{
*max2 = *begin;
*max1 = *end;
}
}
else
{
search3(begin , middle, &lmax1, &lmax2);
search3(middle, end, &rmax1, &rmax2);
if(lmax2 >= rmax1)
{
*max1 = lmax1;
*max2 = lmax2;
}
if(lmax1 >= rmax1 && rmax1 >= lmax2)
{
*max1 = lmax1;
*max2 = rmax1;
}
if(rmax1 >= lmax1 && lmax1 >= rmax2)
{
*max1 = rmax1;
*max2 = lmax1;
}
if(rmax2 >= lmax1)
{
*max1 = rmax1;
*max2 = rmax2;
}
}
}
如何求数组中的最大数和第二大数
最新推荐文章于 2022-11-30 08:10:12 发布