C++ 用分治算法计算阵列的最大数目

C++ 用分治算法计算阵列的最大数目,c++,arrays,algorithm,recursion,divide-and-conquer,C++,Arrays,Algorithm,Recursion,Divide And Conquer,我制作了一个程序,使用分治算法计算数组的最大值,但输出为0 #include <iostream> using namespace std; int array[50]; void maximum(int index1, int index2, int&max_number) { int max_number1; int max_number2; int half; if (index1 == index2) max_numb

我制作了一个程序,使用分治算法计算数组的最大值,但输出为0

#include <iostream>
using namespace std;
int array[50];

void maximum(int index1, int index2, int&max_number) {
    int max_number1;
    int max_number2;
    int half;
    if (index1 == index2)
        max_number = array[index1];
    else {
        half = (index1 + index2) / 2;
        maximum(index1, half, max_number1);
        maximum(half + 1, index2, max_number2);
        if(max_number1 < max_number2)
        max_number = max_number2;
        else
        max_number = max_number1;
    }
}

int main() {
    int index1;
    int index2;
    int max_number = 0;
    cout << "index2 = ";
    cin >> index2;
    for (index1 = 0; index1 < index2; index1++)
        cin >> array[index1];
        maximum(index1, index2, max_number);
    cout << "maximum number = " << max_number;
    return 0;
}
#包括
使用名称空间std;
int数组[50];
无效最大值(int index1、int index2、int和max_数){
int max_数1;
int max_数2;
半整数;
如果(index1==index2)
最大_数=数组[index1];
否则{
半=(index1+index2)/2;
最大值(索引1,一半,最大值1);
最大值(半加1,指数2,最大值2);
如果(最大值1<最大值2)
最大数量=最大数量2;
其他的
最大数量=最大数量1;
}
}
int main(){
int index1;
int index2;
int max_number=0;
cout>index2;
对于(index1=0;index1>阵列[index1];
最大值(index1、index2、最大值);

这部分代码是否有输入错误

for(index1 = 0; index1 < index2; index1++)
将在第1/2个参数中传递相同的值,您可以如下更改代码

for(index1 = 0; index1 < index2; index1++)
    cin>>array[index1];
index1 = 0;
maximum(index1, index2, max_number);
for(index1=0;index1>阵列[index1];
index1=0;
最大值(index1、index2、最大值);
在此循环之后

for(index1 = 0; index1 < index2; index1++)
cin>>array[index1];
没有道理

在任何情况下,函数都太复杂,并且使用全局变量,这是一种糟糕的编程实践

使用标准算法
std::max
,可以更简单地编写递归函数

比如说

#include <iostream>
#include <algorithm>

size_t maximum( const int a[], size_t n )
{
    return n < 2 ? 
           0     : 
           std::max( maximum( a, n / 2 ), 
                     n / 2 + maximum( a + n / 2, n - n / 2 ), 
                     [a] ( size_t i, size_t j ) { return a[i] < a[j]; } );  
}

int main() 
{
    const size_t N = 10;
    int a[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int b[N] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int c[N] = { 0, 2, 4, 6, 8, 9, 7, 5, 3, 1 };

    size_t pos = maximum( a, N );
    std::cout << "The maximum element is " << a[pos] 
              << " at position " << pos  << std::endl;

    pos = maximum( b, N );
    std::cout << "The maximum element is " << b[pos] 
              << " at position " << pos  << std::endl;

    pos = maximum( c, N );
    std::cout << "The maximum element is " << c[pos] 
              << " at position " << pos  << std::endl;

    return 0;
}

此呼叫最大值(index1、index2、max_编号);没有意义,因为在上一个循环之后index1等于index2。为什么不使用标准库已经提供的内容:?@JesperJuhl可能的目标是理解如何编写分治算法,而不是计算某个特定数组的最大元素。@Rotem可能。但问题应该是这样说的。@Jesper Juh问题中的函数是递归函数。标准算法不是递归函数,也不使用“分而治之”的方法。
maximum(index1, index2, max_number);
#include <iostream>
#include <algorithm>

size_t maximum( const int a[], size_t n )
{
    return n < 2 ? 
           0     : 
           std::max( maximum( a, n / 2 ), 
                     n / 2 + maximum( a + n / 2, n - n / 2 ), 
                     [a] ( size_t i, size_t j ) { return a[i] < a[j]; } );  
}

int main() 
{
    const size_t N = 10;
    int a[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int b[N] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int c[N] = { 0, 2, 4, 6, 8, 9, 7, 5, 3, 1 };

    size_t pos = maximum( a, N );
    std::cout << "The maximum element is " << a[pos] 
              << " at position " << pos  << std::endl;

    pos = maximum( b, N );
    std::cout << "The maximum element is " << b[pos] 
              << " at position " << pos  << std::endl;

    pos = maximum( c, N );
    std::cout << "The maximum element is " << c[pos] 
              << " at position " << pos  << std::endl;

    return 0;
}
The maximum element is 9 at position 9
The maximum element is 9 at position 0
The maximum element is 9 at position 5