分治算法介绍

分治算法是一种将问题分解成更小子问题,解决子问题,然后将它们的结果合并以解决原始问题的方法。对于查找数组的最大和次大元素,我们可以将数组分成两部分,然后分别查找每个子数组的最大和次大元素,最后将这些结果合并以得到原始数组的最大和次大元素。

算法步骤

  1. 如果数组只有一个元素,那么它既是最大元素又是次大元素,直接返回。

  2. 如果数组有多个元素,将数组分成两个子数组:左子数组和右子数组。

  3. 递归地在左子数组中查找最大和次大元素,并在右子数组中查找最大和次大元素。

  4. 将左子数组的最大和次大元素与右子数组的最大和次大元素进行比较,以找到原始数组的最大和次大元素。

示例代码

#include <iostream>
#include <vector>

using namespace std;

// 定义一个结构体来表示最大和次大元素对
struct MaxAndSecondMax {
    int max_element;
    int second_max_element;
};

// 分治函数,用于查找数组的最大和次大元素
MaxAndSecondMax findMaxAndSecondMax(const vector<int>& arr, int start, int end) {
    MaxAndSecondMax result;
    
    // 如果数组只有一个元素,那么它是最大元素,次大元素为空
    if (start == end) {
        result.max_element = arr[start];
        result.second_max_element = INT_MIN; // 初始次大元素为负无穷大
    }
    // 如果数组有两个元素,比较它们并返回
    else if (start + 1 == end) {
        if (arr[start] > arr[end]) {
            result.max_element = arr[start];
            result.second_max_element = arr[end];
        } else {
            result.max_element = arr[end];
            result.second_max_element = arr[start];
        }
    }
    // 如果数组有多个元素,分成左右两部分并递归查找最大和次大元素
    else {
        int mid = (start + end) / 2;
        MaxAndSecondMax left = findMaxAndSecondMax(arr, start, mid);
        MaxAndSecondMax right = findMaxAndSecondMax(arr, mid + 1, end);
        
        // 合并左右子问题的结果
        if (left.max_element > right.max_element) {
            result.max_element = left.max_element;
            result.second_max_element = max(left.second_max_element, right.max_element);
        } else {
            result.max_element = right.max_element;
            result.second_max_element = max(right.second_max_element, left.max_element);
        }
    }
    
    return result;
}

int main() {
    vector<int> arr = {3, 1, 5, 2, 7, 4};
    
    MaxAndSecondMax result = findMaxAndSecondMax(arr, 0, arr.size() - 1);
    
    cout << "最大元素: " << result.max_element << endl;
    cout << "次大元素: " << result.second_max_element << endl;
    
    return 0;
}