001.Max2:使用递归求解数组中最大的两个元素

本文介绍了一种使用递归算法求解数组中最大的两个数字的方法。通过将数组分为两部分并递归求解,最后比较两部分的最大值来找到整个数组的最大两个数值。
#include <iostream>
#include <algorithm>

using namespace std;
//****递归求解数组里面最大的两个数字******//
void max2(int a[], int lo, int hi, int &x1, int &x2)
{
    if (lo + 2 == hi)
    {
        if (a[lo] >= a[hi-1])
        {
            x1 = a[lo];
            x2 = a[hi-1];
            return;
        }
        else
        {
        	x1 = a[hi - 1];
        	x2 = a[lo];
        	return;
        }
    }
    if (lo + 3 == hi)
    {
        x1 = max(a[lo], max(a[lo + 1], a[hi - 1]));
        x2 = a[lo] + a[lo + 1] + a[hi - 1] - x1 - min(a[lo], min(a[lo + 1], a[hi - 1]));
        return;
    }
    int mi = (lo + hi) >> 1;
    int x1L, x2L;
    max2(a, lo, mi, x1L, x2L);
    int x1R, x2R;
    max2(a, mi, hi, x1R, x2R);
    if (a[x1L] > a[x1R])
    {
        x1 = x1L;
        x2 = (a[x2L] > a[x1R]) ? x2L : x1R;
        return;
    }
    else
    {
    	x1 = x1R;
    	x2 = (a[x1L] > a[x2R]) ? x1L : x2R;
    	return;
    }
}

int main()
{
    int a[10] = { 8, 3, 30, 25, 10, 22, 31, 35, 21, 19 };
    int x1=0, x2=0;
    max2(a, 0, 10, x1, x2);
    cout << "x1 = " << x1 << endl;
    cout << "x2 = " << x2 << endl;
    return 0;
}
第3关:寻找数组最大和次元素200 学习内容 记录 评论 任务描述 相关知识 如何求出最大值 编程要求 测试说明 任务描述 本关任务:编写一个用分治法求解数组中查找最大和次元素问题小程序。 相关知识 为了完成本关任务,你需要掌握:1.如何分解子问题,2.如何合并子问题的解。 如何求出最大值 查找最大和次元素问题:对于给定的含有n个整的无序序列,求这个序列中最大和次两个不同的元素。 例如: a=[1,3],max1=3,max2=1。 a=[1,3,3],max1=3,max2=3。 a=[3],max1=3,max2=-∞。 使用分治法,求数组a[low...high]中最大元素max1和次元素max2的过程如下: 若low==high,则max1=a[low],max2=-INF(-∞)。 若low==high-1,则max1=max(a[low],a[high]),max2=min(a[low],a[high])。 若low<high-1,按中间位置mid=(low+high)/2划分为a[low...mid]和a[mid+1..high]左右两个区间(注意左区间包含a[mid]元素)。递归求出左区间最大元素lmax1和次元素lmax2递归求出右区间最大元素rmax1和次元素rmax2。 合并:若lmax1>rmax1,则max1=lmax1,max2=max(lmax2,rmax1),否则max1=rmax1,max2=max(lmax1,rmax2)。 编程要求 根据提示,在右侧编辑器补充代码,计算并输出数组最大值和次值。 测试说明 平台会对你编写的代码进行测试: 5 1 2 3 4 5 数组元素: 1 2 3 4 5 提示: int n = scanner.nextInt(); // 读取数组元素 int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = scanner.nextInt(); 输出: 最大元素:5 次元素:4用Java
11-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值