Bootstrap

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两个额外的变量,就很好的化解要考虑多种情况。

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

;