查找数组的最大值

时间:2013-05-08 20:29:01

标签: c++ arrays recursion max dynamic-arrays

例如:

array[] = {3, 9, 10, **12**,1,4,**7**,2,**6**,***5***}

首先,我需要最大值= 12然后我需要在数组的其余部分(1,4,7,2,6,5)中获得最大值,所以value = 7,然后是数组6其余部分的maxiumum值,然后5,之后,我将需要一系列这个值。这回馈(12,7,6,5)。

如何获得这些数字? 我尝试了以下代码,但似乎无限 我想我需要一个递归函数但是我该怎么做呢?

max=0; max2=0;...
   for(i=0; i<array_length; i++){

             if (matrix[i] >= max)
                max=matrix[i];

             else {
                  for (j=i; j<array_length; j++){

                      if (matrix[j] >= max2)
                      max2=matrix[j];

                      else{
                       ...
                        ...for if else for if else
                         ...??
                      }
                  }
             }
         }

4 个答案:

答案 0 :(得分:5)

这是使用std::max_element()标准算法在C ++ 11中执行此操作的方法:

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    int arr[] = {3,5,4,12,1,4,7,2,6,5};

    auto m = std::begin(arr);
    while (m != std::end(arr))
    {
        m = std::max_element(m, std::end(arr));
        std::cout << *(m++) << std::endl;
    }
}

这是live example

答案 1 :(得分:2)

这是使用Cartesian tree数据结构的绝佳位置。笛卡尔树是一系列具有这些属性的元素构建的数据结构:

  • 笛卡尔树是二叉树。
  • 笛卡尔树遵循堆属性:笛卡尔树中的每个节点都大于或等于其所有后代。
  • 笛卡尔树的顺序遍历会返回原始序列。

例如,给定序列

4  1  0  3  2

笛卡尔树将是

   4
    \
     3
    / \
   1   2
    \
     0

请注意,这遵循堆属性,并且inorder walk会返回序列4 1 0 3 2,这是原始序列。

但这是关键观察:请注意,如果你从这棵笛卡尔树的根开始并开始向右走,你会得到数字4(序列中最大的元素),然后是3(最大的元素)在4)之后发生的事情,以及数字2(3之后的最大元素)。更一般地说,如果你为序列创建一个笛卡尔树,那么从根开始并继续向右走,你将得到你正在寻找的元素序列!

这样的美妙之处在于笛卡尔树可以constructed in time Θ(n),这是非常快的,沿着脊柱行走只需要时间O(n)。因此,找到您正在寻找的序列所需的总时间是Θ(n)。注意“找到最大元素,然后找到之后出现的子阵列中的最大元素,等等”的方法。如果输入按降序排序,则在最坏的情况下会在时间Θ(n 2 )中运行,所以这个解决方案要快得多。

希望这有帮助!

答案 2 :(得分:0)

如果您可以修改数组,您的代码将变得更简单。每当您找到max时,输出该值并将其在原始数组中的值更改为某个较小的数字,例如-MAXINT。输出数组中的元素数后,就可以停止迭代了。

答案 3 :(得分:0)

std::vector<int> output;
for (auto i : array)
{
    auto pos = std::find_if(output.rbegin(), output.rend(), [i](int n) { return n > i; }).base();
    output.erase(pos,output.end());
    output.push_back(i);
}

希望您能理解该代码。我在用C ++编写算法比用英语编写算法要好得多,但这是一次尝试。

在我们开始扫描之前,output为空。这是空输入的正确状态。

我们首先查看输入数组中第一个未查看的元素 I 。我们向后扫描输出,直到找到 G 元素,该元素大于 I 。然后我们从 G 之后的位置开始删除。如果我们找不到,那就意味着 I 是我们搜索到的元素的最大元素,因此我们会删除整个output。否则,我们会删除 G 之后的所有元素,因为 I G 开始是最好的通过我们迄今为止搜索过的内容。然后我们将 I 附加到output。重复直到输入数组耗尽。

相关问题