【问题标题】:Finding minimum and maximum in a array c++在数组c ++中查找最小值和最大值
【发布时间】:2017-08-18 22:50:15
【问题描述】:

我必须使用分治法找到数组中元素的最小值和最大值。我已经编写了一个代码,但它不适用于数组中超过 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;
}

【问题讨论】:

  • 你试过使用调试器吗?
  • 您要对数组进行排序还是只查找最大值和最小值?
  • 起初int mid=i+j/2; 不正确。可能你想写int mid=(i+j)/2;
  • 为什么要使用分而治之的方式来找到最大值和最小值?如果数组已排序,因此您无需查找它们,它们是数组中的第一个和最后一个
  • 您通常应该避免使用全局变量。更重要的是永远不要使用未初始化的变量。当然,这两个 cmets 都与 int minimum=999,maximum,mi,ma; 相关,它们是全局变量,maximum 未初始化使用。

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


【解决方案1】:

您的代码有一些错误

  1. 您的代码从用户输入中读取 n,但您只提供了 10 个大小的数组,用户可以尝试输入 10+ 个数字,因此在这种情况下我们将出现未定义的行为。
  2. 你写得非常糟糕而且难以阅读。如果您希望其他人阅读您的代码,请查看您最喜欢的书籍或互联网信息,了解如何编写美观且易读的代码。
  3. 您自己实现了该算法。这是一个坏习惯,使用标准库算法,你不会遇到这样的错误。

.

#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;
}

【讨论】:

    【解决方案2】:

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

    改变

    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 本身而不是整个数组)

    【讨论】:

    • 虽然这是正确的,但这个答案的格式看着很痛苦
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 2021-09-15
    • 2021-06-18
    • 2018-08-01
    • 2019-03-31
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多