【问题标题】:How to find the maximum and minimum value in an array without using if statement?如何在不使用if语句的情况下找到数组中的最大值和最小值?
【发布时间】:2013-12-04 02:05:04
【问题描述】:

如何在不使用if语句的情况下找到数组中的最大值和最小值。c++中有没有内置函数可以做到这一点?如果不是,插入排序是唯一的方法吗?在此先感谢。

【问题讨论】:

  • 是允许在内部使用if语句的函数
  • 有一些技巧可以在没有分支的情况下完成,这可能会满足您的需求。不适合胆小的人。 :) graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
  • @RetiredNinja 的链接有使用掩码的无分支条件示例。这也是一种向量化具有条件的循环的方法(手动或由编译器为您完成)。

标签: c++ arrays c++11 max min


【解决方案1】:

如果您使用 C++11,请使用 std::minmax_element,如果不使用,请使用 std::min_element/std::max_element

std::vector<int> v = {1,2,3,4};
auto minmax = std::minmax_element(v.begin(), v.end());
// now minmax.first points on 1 and minmax.second points on 4

但是,如果 if condition 不应在内部使用 - 您可以使用以下内容

template<typename Iterator>
std::pair<Iterator, Iterator> minmax_element(Iterator first, Iterator last)
{
   Iterator min = first, max = first;
   while (first != last)
   {
      min = *min > *first ? first : min;
      max = *max > *first ? max : first;
      ++first;
   }
   return std::make_pair(min, max);
}

【讨论】:

  • 我不确定他的问题是否不清楚,但显然 minmax 在内部使用了 if 语句,你可以不用
  • @aaronman 当然在内部使用if,但是sort没有if语句也不是简单的事情。
  • 他没有说任何关于排序的事情,但是编写一个与 minmax 做同样事情的函数相对容易,当然我对他的问题的解释完全可以理解
【解决方案2】:

首先,您可以实现函数 sort(a, b),它返回一对排序后的值。为此,您可以使用以下想法:min(a, b) = (a+b)/2 - |a-b|/2max(a, b) = (a+b)/2 + |a-b|/2

但是这里有函数|x|=abs(x),它在内部使用'if'。所以,我们应该在没有任何“if”的情况下实现“abs”。最简单的方法之一是:abs(x) = sqrt(x*x)(它很慢,但这只是一个想法)。对于整数值,您可以使用以下方法:12 等。

因此,您可以实现函数 sort(a,b),它只对没有任何“if”的值进行排序。之后,您可以使用此函数对数组进行排序。之后,该排序数组的第一个元素将是最小值,最后一个元素将是最大元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2016-02-13
    • 2014-02-14
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多