当前位置: 首页 > article >正文

C 语言 数组交换最小值和最大值

题目

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。注意:题目保证最大和最小值都是唯一的。

方法一

#include <stdio.h>
int main()
{
	int n, min, max, cop=0;
	int arr[10] = { 0 };
	scanf("%d", &n);
	//数组赋值
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	//假设最小值和最大值数组的首元素
	min = arr[0];
	max = arr[0];
	//找出最小值
	for (int i = 0; i < n; i++)
	{
		if (arr[i] < min)
		{
			min = arr[i];
			cop = i;
		}
	}
	//交换最小值与数组首元素
	//创建临时变量 tmp
	int tmp = arr[0];
	arr[0] = min;
	arr[cop] = tmp;
	//找出最大值
	for (int i = 0; i < n; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
			cop = i;
		}
	}
	//交换最大值与数组最后一个元素
	tmp = arr[n - 1];
	arr[n - 1] = max;
	arr[cop] = tmp;
	//打印输出
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

方法一思路,从上找到数组的最小值和最大值入手,找到一个数组的最小值和最大值,首先假设数组的首元素是最大值和最小值,接着遍历数组,依次判断是否为最大值和最小值,如果是更新min或max。接下来交换最大值和最小值就简单了,我们目前已经得到了min和max,现在只需要记录下他们各自的索引值,然后再交换就可以了

如下,找出最大值和最小值的具体代码

#include <stdio.h>
int main()
{
    int arr[10] = { 0 };
    int n,min,max;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    min = arr[0];
    max = arr[0];
    for (int i = 0; i < n; i++)
    {
        //找出最大值
        if (arr[i] < min)
        {
            min = arr[i];
        }
        //找出最小值
        if (arr[i] > max)
        {
            max = arr[i];
        }
    }
    printf("%d %d", min, max);


    return 0;
}

方法二

int main()
{
	int arr[10] = {0};
	int n,min,max,cop1=0,cop2=0;

	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	min = arr[0];
	max = arr[0];
	//遍历数组
	for (int i = 1; i < n; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
			cop1 = i;  //最大索引值
		}
		
		if (arr[i] < min)
		{
			min = arr[i];
			cop2 = i;   //最小索引值
		}

	}
	//8 2 5 1 4
	if (max == arr[0]) //第一位就是最大值
	{
		int tmp2 = arr[n - 1];
		arr[n - 1] = arr[cop1];
		arr[cop1] = tmp2;
		//4 2 5 1 8
		if (n > 2)
		{
			int tmp1 = arr[0];
			arr[0] = arr[cop2];
			arr[cop2] = tmp1;
		}
	}
	//2 8 5 4 1
	else if (min == arr[n - 1]) //最后一位就是最小值
	{
		int tmp1 = arr[0];
		arr[0] = arr[cop2];
		arr[cop2] = tmp1;
		//1 8 5 4 2
		if (n > 2)
		{
			int tmp2 = arr[n - 1];
			arr[n - 1] = arr[cop1];
			arr[cop1] = tmp2;
		}
	}
	//8 2 5 4 1
	else if(min==max)
	{
		int tmp = arr[cop1];
		arr[cop1] = arr[cop2];
		arr[cop2] = tmp;
	}
	//2 8 1 5 4
	else
	{
		int tmp2 = arr[n - 1];
		arr[n - 1] = arr[cop1];
		arr[cop1] = tmp2;
		int tmp1 = arr[0];
		arr[0] = arr[cop2];
		arr[cop2] = tmp1;

	}

	//打印
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

方法二我简单说一下,没有使用额外的min和max的值,而是直接利用两个索引值进行交换,但这需要考虑最大值和最小值的位置情况,如最大值在首元素时,如果先交换最小值再交换最大值,那在交换最小值后,数组元素改变,再使用索引值交换最大值时会出错,因为数组元素已经改变,需要更新索引值,这就不得不分情况考虑,无形之中就增加了代码量,所以并不建议,这里不再多做介绍,就算你有比较好的处理方式,也不建议,因为方法一的思路明显更简便。

推荐第一种方法,思路简单不复杂,巧妙的化解了使用数组中的两个元素交换时要考虑的最大值和最小值的位置情况,创建两个变量,接受数组的最大值和最小值,在交换时就不用考虑可能最大值在第一个位置或者其他而导致在交换下一个值时,数组的元素已经改变。所以,使用另外两个min和max两个额外的变量,就很好的化解要考虑多种情况。

其实这种题目主要是思路上问题,看看有没有更优解,方法一是我认为对于小白来说比较简便的思路了,至于其他的实现思路,欢迎各位指导。


http://www.kler.cn/a/393170.html

相关文章:

  • 【畅购电商】项目总结
  • 贪心算法.
  • vue 本地自测iframe通讯
  • Android service framework笔记
  • 【WRF模拟】如何得到更佳的WRF模拟效果?
  • CCF-GESP 等级考试 2023年12月认证C++五级真题解析
  • goframe开发一个企业网站 统一返回响应码 18
  • 2024-11-13 Unity Addressables2——寻址资源设置
  • 【vue2.0入门】vue基本语法
  • 【论文笔记】Prefix-Tuning: Optimizing Continuous Prompts for Generation
  • Spring框架之策略模式 (Strategy Pattern)
  • NoETL
  • 【网络安全】OSI网络安全体系结构
  • 接口自动化分支管理规范
  • Android音频架构
  • <websocket><PLC>使用js和html实现webscoket,与PLC进行socket通讯的实例
  • SPSS频率统计计算公式示例
  • 电子电气架构 ---车载以太网络环境下的安全威胁
  • 1. ShardingJDBC实际使用01
  • 详解机器学习经典模型(原理及应用)——DBSCAN
  • C++网络编程之SSL/TLS加密通信
  • turtlesim修改窗口大小;添加自己的小乌龟;
  • React Native 全栈开发实战班 - 列表与滚动视图
  • 【无线传感器网络】数据集合集!
  • 云服务器搭建及Docker使用---清风
  • 贪心算法理论