在数组c ++中查找最小值和最大值

时间:2017-03-26 06:48:05

标签: c++ arrays divide-and-conquer

我必须使用分而治之来找到数组中元素的最小值和最大值。我编写了一个代码,但它不适用于数组中超过6个元素。我不知道这个问题是什么

#include<iostream>
using namespace std;
int minimum=999,maximum,mi,ma;
void result(int mi,int ma)
{
    if(maximum<ma)
    {
        maximum=ma;
    }
    if(minimum>mi)
    {
        minimum=mi;
    }
}
void maxmin(int arr[],int i,int j)
{
    cout<<" i ="<<i<<" j= "<<j<<endl;
    if(i==j)
    {
        mi=ma=arr[i];
        result(mi,ma);
    }
    else if(i==j-1)
    {
        if(arr[i]>arr[j])
        {
            ma=arr[i];
            mi=arr[j];
        }
        else
        {
            mi=arr[i];
            ma=arr[j];
        }
        result(mi,ma);
    }
    else
    {
        int mid=i+j/2;
        maxmin(arr,i,mid);
        maxmin(arr,mid+1,j);
    }
}
int main()
{
    int arr[10],n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    maxmin(arr,0,n-1);
    cout<<" max "<<maximum<<" min "<<minimum<<endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您的代码有一些错误

  1. 您的代码从用户输入中读取n,但您只提供了10个大小的数组,并且用户可以尝试输入10个以上的数字,因此在这种情况下我们将有一个未定义的行为。
  2. 你写的非常糟糕且难以理解。如果您希望其他人阅读您的代码,请查看您最喜欢的书籍或互联网信息,了解如何编写漂亮且可读的代码。
  3. 您自己实施了该算法。这是一个坏习惯,使用标准库算法,你不会遇到这样的错误。
  4. #include <iostream> // std::cin, std::cout
    #include <cstddef> // std::size_t
    #include <algorithm> // std::min_element, std::max_element
    
    int main ()
    {
        std::size_t array_size;
        std::cin >> array_size;
    
        int *some_array = new int[array_size]; // Allocate memory dynamically
        for(std::size_t i = 0; i < array_size; ++i)
        {
            std::cin >> some_array[i];
        }
    
        /* Standard library operate on iterators, they are special classes
         * that have interface that is similar in many cases to pointers (so we can use pointers as iterators).
         * std::min/max_element needs one iterator for the sequence beginning  
         * and one iterator after the end. It returns iterator to a found element. 
        */
        int min = *std::min_element(some_array, some_array + array_size);
        int max = *std::max_element(some_array, some_array + array_size);
    
        delete[] some_array;
    
        std::cout << "Min = " << min << std::endl << "Max = " << max;
        std::cout << std::endl;
    }
    

答案 1 :(得分:0)

代码编写得不好,首先干掉你的代码,你会很容易发现问题。

更改

else
    {
        int mid=i+j/2;
        maxmin(arr,i,mid);
        maxmin(arr,mid+1,j);
    }

else
    {
        int mid=(i+j)/2; /*** Adding brackets  ***/
        maxmin(arr,i,mid);
        maxmin(arr,mid+1,j);
    }

检查调用结果函数的逻辑(因为根据你的逻辑,两个子集分别计算MIN和MAX本身不是整个数组)