分治法设计技术

简介: 设计一个程序,采用分治法求含n个实数序列中的最大元素和次大元素,并分析算法的时间复杂度1.算法设计2.程序清单3.运行结果

设计一个程序,采用分治法求含n个实数序列中的最大元素和次大元素,并分析算法的时间复杂度

1.算法设计

情况1:区间中只有一个值

最大值为该值

maxFirst = a[low];

次大值为无穷小

maxSecond = INT_MIN;

情况2:区间中只有两个值

最大值为两数中的较大数

maxFirst = max(a[low], a[high]);

次大值为另一个数

maxSecond=min(a[low], a[high]);

情况3:区间中有多个值

1计算区间中位数 mid

int mid = (low + high) / 2;

2递归求取左区间([low, mid])最大值及次打值

solve(a, low, mid, leftMaxFirst, leftMaxSecond);

3递归求取右区间([mid + 1, high])最大值及次大值

solve(a, mid + 1,high, rightMaxFirst, rightMaxSecond);

情况:4判断四个数中的最大值及次大值

左区间最大值 > 右区间最大值

最大值:必为左区间最大值

maxFirst = leftMaxFirst;

次大值:max(左区间次大值, 右区间最大值)

maxSecond = max(leftMaxSecond, rightMaxFirst);

左区间最大值 < 右区间最大值

最大值: 必为右区间最大值

maxFirst = rightMaxFirst;

次大值: max(右区间次大值, 左区间最大值)

maxSecond = max(leftMaxFirst, rightMaxSecond);


2.程序清单

在这里插入代码片//
// Created by xpc on 2023/3/18.
//
#include <iostream>
#include <limits.h>
#include <algorithm>
using namespace std;
/**
 * 查找最大和次大元素,分为3种情况
 * @param a
 * @param low
 * @param high
 * @param maxFirst
 * @param maxSecond
 */
void solve(int a[],int low,int high,int &maxFirst,int &maxSecond) {
    //1.区间中只有一个元素
    if (low==high) {
        maxFirst = a[low];
        //表示无穷小
        maxSecond = INT_MIN;
    }
        //2.区间中只有两个元素
    else if (low==high-1) {
        maxFirst = max(a[low], a[high]);
        maxSecond=min(a[low], a[high]);
    }
        //3.区间有两个以上元素
    else {
        int mid = (low + high) / 2;
        //左区间中求leftMaxFirst和leftMaxSecond
        int leftMaxFirst, leftMaxSecond;
        solve(a, low, mid, leftMaxFirst, leftMaxSecond);
        //右区间中求rightMaxFirst和rightMaxSecond
        int rightMaxFirst, rightMaxSecond;
        solve(a, mid + 1,high, rightMaxFirst, rightMaxSecond);
        if (leftMaxFirst> rightMaxFirst) {
            //leftMaxSecond、rightMaxFirst中求次大元素
            maxFirst = leftMaxFirst;
            maxSecond = max(leftMaxSecond, rightMaxFirst);
        }
        else {
            //leftMaxFirst、rightMaxSecond中求次大元素
            maxFirst = rightMaxFirst;
            maxSecond = max(leftMaxFirst, rightMaxSecond);
        }
    }
}
int main() {
    int n = 0;
    cout << "请输入元素个数" << endl;
    cin >> n;
    int *a = new int[n];
    cout << "请输入元素:" << endl;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    int maxFirst, maxSecond;
    solve(a,0,n-1, maxFirst, maxSecond);
    cout << "最大值为:" << maxFirst<< " " << "次大值为:" << maxSecond << endl;
    system("exit");
}


3.运行结果

28.png


29.png



相关文章
|
2月前
|
算法 C++
计算机算法设计与分析 第2章 递归与分治策略 (笔记)
计算机算法设计与分析 第2章 递归与分治策略 (笔记)
|
3月前
|
存储 算法 搜索推荐
【算法设计与分析】—— 分治算法
【算法设计与分析】—— 分治算法
35 0
|
算法
五大常用算法-分治算法
五大常用算法-分治算法
48 0
|
12月前
|
移动开发 网络虚拟化
【五讲四美】之“讲思想”
发挥一点工匠精神,对一个技术组内小运营需求的精进优化过程。
70 0
【五讲四美】之“讲思想”
|
12月前
|
算法 搜索推荐
深入探索快速排序:高效分而治之的算法
深入探索快速排序:高效分而治之的算法
63 0
|
存储 算法
递归算法设计技术
实验目的 实验内容 实验过程 程序清单 复杂度分析 运行结果
116 0
|
机器学习/深度学习 算法 搜索推荐
<<算法很美>>——(二)详解递归思想
<<算法很美>>——(二)详解递归思想
<<算法很美>>——(二)详解递归思想
|
算法 搜索推荐
【算法】七大排序算法
【算法】七大排序算法
【算法】七大排序算法
|
存储 算法 搜索推荐
算法系统学习-找第k小值(非等分分治)
该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点
122 0
|
人工智能 算法 搜索推荐
算法系统学习-大事化小,小事化了(分而治之)
该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点
241 0