1.问题描述:在实际问题中,通常会遇到许多第二的问题。比如:第二名,第二大和第二小等。在已知的n个数据中找出其中第二小的数据。
2.根据问题描述,利用数组a[]存储已知数据,定义两个变量,min1和min2,分别用来存储数据中的第一小值和第二小值,对已知数字进行比较之后,便可从中选出第二小的数据,输出即可。此算法的时间复杂度为O(n).
3.算法说明
类型 | 说明 |
---|---|
算法 | second2(int a[ ],int n) |
形参数组 | a:存放已知数据 |
形参变量 | n:已知数据的个数 |
变量 | min1:存放最小的数据 |
变量 | min2:保存第二小数据 |
4.代码实现及分析
#include<stdio.h>
int second2(int a[ ],int n) //求第二小的函数
{
int i,min1,min2;
if(a[0]<a[1]) //如果a[0]小于a[1]
{
min1=a[0]; //把a[0]赋给最小值
min2=a[1]; //a[1]赋给第二小值
}
else {
min1=a[1];
min2=a[0];
}
for(i=2;i<n;i++) //i从第二个数开始遍历
if(a[i]<min2) //若某个数小于min2
{
if(a[i]<min1) //并且这个数也小于min1
{
min2=min1; //把原来最小的数赋给第二小的数
min1=a[i]; //把该数的值赋给最小值
}
else //否则,若该数只小于第二小,并没有小于最小值
min2=a[i]; //则把它的值赋给第二小值
}
return (min2); //将第二小的值返回
}
/*主函数,输入m个数,保存在数组a中,调用second2函数,输出第二小的值*/
int main(){
int a[100],i,m;
printf("请输入数据个数m:");
scanf(" %d",&m);
printf("请输入m个已知数据:");
for(i=0;i<m;i++)
scanf("%d",&a[i]);
printf("第二小的数据为%d",second2(a,m));
}
5.运行结果