【C语言】利用数组实现最小值和次小值及其各自下标

最近深入学习了数组,在老师的教导下练习了一些程序,做这道题的时候绞尽脑汁,还是没能在规定的时间完成,后来匆匆完成,d但又不太懂就今天又看了一遍,总结分享一下,希望能够帮助和我一样对这道题感到困扰的同学。

目录

题目:

冒泡排序:

根据冒泡排序找出10个数中最小的两个数:

 输出最小的两个数及其下标:

方法一:

方法二:

方法三:


题目:

已知一个数组,找出其中最小的2个数及对应的下标,输出结果。

拿到这道题呢,我首先想的是怎样找到最小的两个数,然后想到利用数组循环以及if语句大小比较可以找到最小的两个数,还可以利用冒泡排序,但是不知道怎么找到其相应的下标。

冒泡排序:

先巩固一下冒泡排序吧!

#include<stdio.h>
#define N 10
int main()
{
	int i, j, t;
	int a[N];
	for (i = 0; i < N; i++)
	{
		scanf("%d", &a[i]);//首先输入这十个数
	}
	printf("\n");
	for(j=0;j<N-1;j++)//十个数进行九趟循环
	{ 
		for (i = 0; i < N - 1 - j; i++)//每趟循环还要进行9-j次比较
		{
			if (a[i] > a[i + 1])//相邻的两个数依次进行比较
			{
				t = a[i];
				a[i] = a[i + 1];
				a[i + 1] = t;//根据比较交换数字大小,分别赋值给相应的数组
			}
		}
	}
	for (i = 0; i < N; i++)
	{
		printf("%d ", a[i]);//最后再依次从小到大的顺序输出这十个数
	}
	printf("\n");
	return 0;
}

这是整个冒泡排序的过程,10个数要进行9趟循环,每趟循环还要进行9-j次比较,最后按照从小到大的顺序输出。

根据冒泡排序找出10个数中最小的两个数:

直接在return 0;前加上输出数组前两位结果就可。顺便看到了冒泡排序结果!

结果实现如下图所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oCd57uq5LiH6Iyc,size_20,color_FFFFFF,t_70,g_se,x_16

 输出最小的两个数及其下标:

方法一:

后来探讨到可以这样找到下标

#include<stdio.h>
#define N 10
int main()
{
	int a[N] = { 5,1,3,4,5,6,7,8,9,2 };
	int i, m=0, n=0, t;
	int min1 = a[0], min2 = a[0];
	for (i = 0; i < N; i++)
	{
		if (min1 > a[i])
		{
			min1 = a[i];
			m = i;
		}
	}
	for (i = 0; i < 10; i++)
	{
		if (min2 > a[i] && i != m)
		{
			min2 = a[i];
			n = i;
		}
	}
	printf("最小值和次小值分别是:%d %d\n", min1, min2);
	printf("他们对应的下标分别是:%d %d\n", m, n);
	return 0;
}

先赋值两个最小值都为a[0]。然后进入for循环语句,利用if语句比较第一次循环找出最小值,同时记录此时的i值(也就是下标)。循环结束后接着第二次循环一样利用if语句进行比较找次小值及其下标,但是要保证这时候的下标i不能等于m(最小值下标),这是为了防止干扰找次小值也避免了两个最小值是相等的情况。这样就成功找到了两个最小值及其下标。但是这个程序的弊端在于直接给出了10个数而不是随机输入的。

在这里我给出的是最小值相等的情况,运行结果如下图所示:

方法二:

后来参考了同学的代码利用scanf随机输入 

#include<stdio.h>
#define N 10
int main()
{
	int a[N];
	int i, m, n;
	m = 0;
	n = 0;
	for (i = 0; i < N; i++)
	{
		scanf("%d", a[i]);
		if (a[i] < a[m])
			m = i;
	}
	for (i = 0, n = (m + 1) % 10; i < N; i++)
	{
		if (a[i] < a[n] && i != m)
			n = i;
	}
	printf("最小值和次小值分别为:%d %d\n", a[m], a[n]);
	printf("他们对应的下标分别为:%d %d\n", m, n);
	return 0;
}

定义的变量很少,直接用a[m]和a[n]来表示最小的两位数,m、n分别表示其下表。也使用了两个for循环语句,直接在第一个循环中利用scanf输入随机值,if比较方法和方法一相同。不同的是在第二个for循环语句中下标n赋值为(m+1)%10,这样就继续了第一个循环中的大小比较,不用重复比较之前的大小。但是为什么要%10呢?我觉得这是为了防止下标m为9的情况,余10为0,然后继续开始第二轮的比较。这种方法真的很简便!

运行结果如下所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oCd57uq5LiH6Iyc,size_20,color_FFFFFF,t_70,g_se,x_16

方法三:

根据我自己的理解也写出了scanf随机输入,以此补充

#include<stdio.h>
#define N 10
int main()
{
	int a[N];
	int i, m, n;
	int min1, min2;
	scanf("%d", &a[0]);
	min1 = a[0], min2 = a[0];
	for (i = 1; i < N; i++)
	{
		scanf("%d", &a[i]);
		if (a[i] < min1)
		{
			min1 = a[i];
			m = i;
		}
	}
	for (i = 1; i < N; i++)
	{
		if (a[i] < min2 && i != m)
		{
			min2 = a[i];
			n = i;
		}
	}
	printf("最小值和次小值分别为:%d %d\n", min1, min2);
	printf("他们对应的下标分别为:%d %d\n", m, n);
	return 0;
}

首先把a[0]复制给两个最小值,然后在for循环语句中输入剩下的9个数并作比较,与第一种方法很类似。我觉得也挺好理解的。

如下图运行结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oCd57uq5LiH6Iyc,size_20,color_FFFFFF,t_70,g_se,x_16

 关于scanf随机输入求两个最小值及其下标可参考方法二和方法三,觉得哪一种方法更好理解即可参考。

以上就是我个人对这道题的理解和代码的实现,如果有错误的或者不足的地方欢迎指出,一起纠错。

  • 14
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值