分治法求序列的最大值和最小值C++

本文介绍了一种利用分治策略求解给定序列中最大值和最小值的方法,同时记录了比较次数,避免了排序操作。通过递归地划分区间并合并结果,实现高效查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定序列,使用分治法求出序列中的最大值,最小值,并输出比较次数(不要用排序方法)

//求解序列中的最大值和最小值
#include <bits/stdc++.h>
using namespace std;
#define max(x,y) x>y?x:y
#define min(x,y) x<y?x:y

void solve(vector <int> a, int low, int high, int &Max,int &Min,int &b){
    if(low == high)     // 区间只有一个元素
    {
        Max = a[low];
        Min = a[low];
        b++;
    }
    else if(low == high - 1)    // 区间只有两个元素
    {
        Max = max(a[low],a[high]);
        Min = min(a[low],a[high]);
        b++;
    }
    else{
        int mid = (low + high) / 2;
        int Lmax, Lmin;
        solve(a, low, mid, Lmax, Lmin,b);     // 左区间求Lmax和Lmin
        int Rmax, Rmin;
        solve(a, mid + 1, high, Rmax, Rmin,b);    // 右区间求Rmax和Rmin
        Max = max(Lmax,Rmax);
        Min = min(Lmin,Rmin);
    }
}//分治法

int main(){
    vector <int> a;//定义一个vector数组
    int number;
    int b=0;
    while (1)
    {
        cin>>number;
        a.push_back(number);//每输入一个数字将其添加到数组的最后 
        if(cin.get() == '\n')//输入回车 跳出循环
            break;
    }
    
    //int n = sizeof(a)/sizeof(a[0]);
    int n = a.size();
    int Max,Min;
    int max,min;
    solve(a, 0, n - 1, Max, Min,b);

    cout<<"Max = "<<Max<<","<<"Min = "<<Min<<endl;
    cout<<"分治法比较次数:"<<b<<endl<<endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值