3

现在我有

def min(array,starting,ending)
  minimum = starting
  for i in starting+1 ..ending
    if array[i]<array[minimum]
      minimum = i
    end    
  end

return minimum
end

Ruby 中有更好的“实现”吗?这个看起来仍然很c-ish。谢谢。

4

5 回答 5

6

如果你想找到最小元素的索引,你可以使用Enumerable#enum_for获取一个 items-index 对的数组,并找到其中的最小值Enumerable#min(这也将是原始数组的最小值)。

% irb
irb> require 'enumerator'
#=> true
irb> array = %w{ the quick brown fox jumped over the lazy dog }
#=> ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"]
irb> array.enum_for(:each_with_index).min
#=> ["brown", 2]

如果要将其绑定到特定的数组索引:

irb> start = 3
#=> 3
irb> stop = 7
#=> 7
irb> array[start..stop].enum_for(:each_with_index).min
#=> ["fox", 0]
irb> array[start..stop].enum_for(:each_with_index).min.last + start
#=> 3
于 2009-05-13T02:42:08.460 回答
1

基本上这是你能做的最好的,虽然你可以写得更简洁一点:

def minval(arr)
    arr.inject {|acc,x| (acc && acc < x ? acc : x)}
end
于 2009-05-13T01:57:34.867 回答
1

有一种更简单的方法,它适用于 ruby​​ 1.9.2:

a = [6, 9, 5, 3, 0, 6]
a.find_index a.min
于 2011-05-07T15:43:06.157 回答
0

这是在数组中查找最小元素的标准算法,在调用此函数之前已经对数组进行排序会更好。

否则我找不到更有效的方法来做到这一点。具体来说,大 O 表示法中的线性时间是我们能做的最好的。

于 2009-05-13T01:43:22.033 回答
-1

如果这不仅仅是一个学术问题,为什么不直接使用 Ruby 的原生sort方法呢?它是使用快速排序算法实现的,被认为非常快。

a = [3, 4, 5, 1, 7, 5]
a.sort![0] # => 1
于 2009-05-13T01:56:29.567 回答