7-1-9 交换最小值和最大值 (15 分)

15 篇文章 3 订阅

交换最大值和最小值

输入格式:
输入在一行中一个整数n
然后输出n个整数

输出格式:
将一组整数中的最小值移动到第一个位置, 最大值移动到最后一个位置

从大一到现在也写了不少题了,也积累了一些经验,形成了自己的一些刷题的风格,也还是一直会出现一些问题,有的问题是因为既有的习惯风格为了让思路清晰、代码较为规整会尽可能的减少变量的使用。

这一题就是这样,总是试图用一个变量去完成一个乃至多个功能,使得代码看起来简洁,但是有时候有些变量必须使用。

这是一道看起来很简单的题,只有一点点的小弯,这个小弯就是下标以及相对应的值的存储和交换,多定义一个变量用来存储交换就好。

#include<stdio.h>
//先让最小值和第一个数交换,再让最大值和第二个数交换
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i = 0 ; i < n; i++)
    {
        scanf("%d",&a[i]);
    }
    int max = a[n-1];//变量加初始化一步到位是推荐的,但那是有具体的数据了,要直接拿来用的
    // 在刷题的时候思路不一样对变量进行初始化的值也会有改变,所以做题的时候初始化不初始化都可以
    // 最终目的还是把题给做出来,在做到大而难的题的时候可以写一些注释让自己的思路更清晰
    // 不至于做到一步然后忘了之前的事在干嘛了.
    int min = a[0];
    int temp;
    for(int i = 0; i < n ; i++)
    {
        if(min > a[i])
        {
            min = a[i];
        	temp = i;//此时temp存储的是最小值的下标,可以用来直接进行与第一个值的交换
        }
    }
    a[temp] = a[0];//交换在循环外边确保交换的下标是最小值的下标
    a[0] = min;
    
    for(int i = 0; i < n ; i++)
    {
        if(max < a[i])
        {
            max = a[i];
	        temp = i;//存储的是最大值的下标
        }
    }
    a[temp] = a[n-1];
    a[n-1] = max;
    
    for(int i = 0; i < n; i++)
        printf("%d ",a[i]);
    return 0;
}

​ 交换最小值之后在交换最大值比较常见的一种思路是先找出来最小值和最大值,然后再分别和第一个元素和最后一个元素进行交换,其中可以分别保存下标和数值。

​ 这样导致的问题就是在进行过最小值和第一个元素的交换之后,最大值的位置可能会发生改变(最大值正好是第一个元素),这样的话之前保存的最大值的下标就失效了,因为最大值的下标随着第一次的交换改变。也没办法再通过之前保存的下标来找到最大值,如果想要知道新的最大值的下标只能再经历一轮新的遍历查找,非常痛苦。

之前我们是查找和交换分开做的,现在将两个步骤同时进行,在找到最小值后就直接进行交换数的交换,由于保存最小值的变量是一个int型变量min没有产生与数组中的下标的联系,所以需要将下标进行存储然后在外循环中通过保存了最小值下标的temp变量进行交换。最大值同理。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Every DAV inci

小辣鸡一枚,不求打赏啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值