PTA6-1 求出数组中最大数和次最大数

该博客主要讨论如何在C++中实现一个函数`void fun(int *a, int n)`,该函数要求找出数组中的最大数和次大数,并将它们与数组的前两个元素对调。博客详细分析了三种情况:完全不重合、部分重合和完全重合,并给出了相应的代码实现,确保在各种情况下都能正确交换最大数和次大数,避免因顺序不同导致的结果差异。" 131402944,14779789,现代化物业报修管理系统的选择与优势,"['物业管理', '云计算应用', '服务评价', '信息系统']
摘要由CSDN通过智能技术生成

New PTA6-1 求出数组中最大数和次最大数

文章目录

为解决 先后交换 最大 与 次大数 顺序引起的 程序结果不同 的问题

解决重点:有关数组的插入顺序,忽略前面数组内 查找 的内容

解决思路:在原函数体的基础题目稍加改进变成一个用户自己输入数据的编程题目

文末附完整代码及简化后的完整代码

程序要求:

要求定义 void fun ( int *a, int n )函数并调用,函数功能是求出数组中最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调,函数形参 a 的类型是整型指针,形参n的类型是int,函数的类型是void。

其中 an都是用户传入的参数。函数 fun 的功能是求出指针a 所指数组中的n个元素的最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。

如果传入的排序数组大小为0就停止排序

主程序样例:
#include <stdio.h>
void fun ( int *a, int n );
int main( )
{
   
    int  n, i;
    while(scanf("%d",&n))
    {
   
        if(n==0)
        {
   
            break;
        }
        int b[n];
        for ( i=0; i<n; i++ ) scanf("%d", &b[i]);
            fun ( b, n );
        printf("对掉之后的数组为:\n");
        for ( i=0; i<n; i++ ) printf("%d ", b[i]);
            printf("\n");
    }
   return 0;
 }

本题的示范数据都使用
a[10]数组元素的不同顺序来演示 如下:

1

分析:1. 排序所用到的数据为

数组首元素 a[0] 数组第二号元素 a[1]
数组中的最大元素 a[Index_Max] 数组中的第二大元素 a[Index_Sec]

2.要做的工作:

2

3 . 需要讨论的情况:

第一种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] 完全不重合

3

测试样例1
10
3 9 5 0 12 6 11 7 10 8
输出样例1
对掉之后的数组为:
12 11 5 0 3 6 9 7 10 8
实现代码 如下:
else//课上交换最大值 次大值的代码部分
    {
   
        int temp=a[0];
        a[0]=a[Index_Max];
        a[Index_Max]=temp;

        temp=a[1];
        a[1]=a[Index_Sec];
        a[Index_Sec]=temp;
    }
此时直接利用临时变量temp进行交换数值即可 (酱油与醋+空瓶子)

第二种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] 重合

在这里插入图片描述

正向重合的时候归入第一种情况的代码
反向重合代码
if(Index_Max==1&&Index_Sec==0)
    {
   
        int     //将两个数值直接交换就可得到要求的数列  涉及的数据 a[0] 和 a[1]
        temp=a[Index_Max];
        a[Index_Max]=a[Index_Sec];
        a[Index_Sec]=temp;

    }

第三种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] 部分重合

正向重合:a[0]与a[Index_Max]重合 或者 a[1] 与a[Index_Sec] 重合(两项指标 红框表示重合)

在这里插入图片描述

输入样例2:
10
6 11 5 0 3 12 9 7 10 8
10
12 9 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值