分治法设计技术

简介: 设计一个程序,采用分治法求含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



相关文章
|
算法 数据挖掘 调度
【算法分析与设计】贪心算法(下)
【算法分析与设计】贪心算法(下)
【算法分析与设计】贪心算法(下)
|
6月前
|
存储 算法 Python
Python算法界的秘密武器:分治法巧解难题,贪心算法快速决策,动态规划优化未来!
【7月更文挑战第9天】Python中的分治、贪心和动态规划是三大关键算法。分治法将大问题分解为小问题求解,如归并排序;贪心算法每步选局部最优解,不保证全局最优,如找零钱;动态规划存储子问题解求全局最优,如斐波那契数列。选择合适算法能提升编程效率。
80 1
|
8月前
|
存储 算法 搜索推荐
【算法设计与分析】—— 分治算法
【算法设计与分析】—— 分治算法
|
算法
算法分析与设计——递归算法(二)1.汉罗塔问题
算法分析与设计——递归算法(二)1.汉罗塔问题
|
算法
算法分析与设计——递归算法(一)
算法分析与设计——递归算法(一)
|
存储 人工智能 算法
【算法分析与设计】回溯法(上)
【算法分析与设计】回溯法(上)
|
存储 人工智能 算法
【算法分析与设计】动态规划(上)
【算法分析与设计】动态规划(上)
|
机器学习/深度学习 存储 算法
【算法分析与设计】贪心算法(上)
【算法分析与设计】贪心算法(上)
|
算法 搜索推荐
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
205 0
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
|
算法
算法排序问题。每种排序代表着没中思考问题的方式。我们学习了选择排序,冒泡排序,归并排序。让我们去回顾回顾吧。重在思想的领悟。
算法排序问题。每种排序代表着没中思考问题的方式。我们学习了选择排序,冒泡排序,归并排序。让我们去回顾回顾吧。重在思想的领悟。
91 0
算法排序问题。每种排序代表着没中思考问题的方式。我们学习了选择排序,冒泡排序,归并排序。让我们去回顾回顾吧。重在思想的领悟。