Max2 递归与分治

本文介绍了使用递归与分治策略解决寻找数组中第二大的数(Max2)的问题。通过将数组二分,递归地解决子问题,并在不同情况下的时间复杂度分析,得出最坏情况下需要比较(5n/3)-2次,最好情况需比较(4n/3)-2次。相较于两次扫描和双指针法,递归分治在最坏情况下仍有较好的效率。

1.题目

从数组区间A[lo, hi)中找出最大的两个整数A[x1]和A[x2],元素比较的次数,要求尽可能的少。

2.数据结构与算法

Algorithm:递归与分治
1.原问题:数组A的Max2?
2.分治:将数组A二分为数组A1与数组A2
3.两个子问题:数组A1的Max2与数组2的Max2?
4.合并:A1的Max2与A2的Max2这4个元素的Max2就是A的Max2
5.递归基:考虑子数组长度为2或3两种情况。

3.源代码

#include "stdafx.h"
#include <iostream>
using namespace std;

void max2(int a[], int lo, int hi, int &x1, int &x2){
   
   
	//递归基
	if(hi - lo == 2){
   
    //2个数求max1, max2
		if(a[lo] > a[lo+1]){
   
   
			x1 = lo;
			x2 = lo+1;
		}else
		{
   
   
			x1 = lo+1;
			x2 = lo;
		}
		return;
	} //T(2)=1
	if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值