Ruby 每个循环中的选择排序设置值

Ruby 每个循环中的选择排序设置值,ruby,selection-sort,Ruby,Selection Sort,我试图找到数组中最小的元素 我尝试用查找最小的方法来实现这一点,如下所示: def finding_smallest arr_arg # first time returns 3; # second time returns 3 again, even though arr_arg doesn't have it. p arr_arg arr_arg.each do |el| if el < @min @min = el end en

我试图找到数组中最小的元素

我尝试用
查找最小的
方法来实现这一点,如下所示:

def finding_smallest arr_arg
  # first time returns 3;
  # second time returns 3 again, even though arr_arg doesn't have it.
  p arr_arg    
  arr_arg.each do |el|
    if el < @min
      @min = el
    end
  end
  @min
end

def selection_sort array
  counter = 0
  sorting = ->(arr){
    arr_range = arr[counter..-1]
    smallest = finding_smallest(arr_range)
    p arr_range # first iteration - whole array; second iteration - [1..end of the array]
    p smallest # first iteration: 3, second iteration: 3;
    first_element_in_range = arr_range[0] # for switching indexes of smallest and first in array
    arr_range[arr_range.index(smallest)], arr_range[0] = arr_range[0], arr_range[arr_range.index(smallest)] #switching places
    counter += 1
    sorting.call(arr_range) unless counter == array.length || arr.nil?
  }
  sorting.call(array)
end

@array = [78, 42, 51, 49, 74, 53, 66, 39, 40, 3, 66, 100]
@min = @array[0]
selection_sort(@array)
def finding_最小arr_arg
#第一次返回3;
#第二次返回3,即使arr_arg没有。
p arr_arg
arr|u arg.每个都有|
如果el<@min
@最小值=el
终止
终止
@闵
终止
def选择_排序数组
计数器=0
排序=->(arr){
arr_范围=arr[计数器..-1]
最小值=找到最小值(arr\u范围)
p arr_range#第一次迭代-整个数组;第二次迭代-[1..数组结束]
p最小#第一次迭代:3,第二次迭代:3;
_range中的第一个_元素_=arr_range[0]#用于切换数组中最小和第一个的索引
arr_range[arr_range.index(最小)],arr_range[0]=arr_range[0],arr_range[arr_range.index(最小)]#交换位置
计数器+=1
除非计数器==array.length | | arr.nil,否则调用(arr_范围)?
}
排序.调用(数组)
终止
@数组=[78,42,51,49,74,53,66,39,40,3,66,100]
@min=@array[0]
选择\u排序(@array)

它返回上一个数组中的最小元素。我认为问题在于
每个
循环没有第二次(或第一次)设置值。我做错了什么?

@min
在[这里]扮演全局变量(
main
的实例变量)的角色。一旦设置,它就永远不会更新,因为最小值再也不会被触及

您可能希望在每次后续调用时更新其值:

def finding_smallest arr_arg
  @min = arr_arg.first

  arr_arg.each do |el|
    if el < @min
      @min = el
    end
  end
  @min
end

您需要
@min
吗?@Stefan我不需要,但由于原始实现返回了一个存储在实例变量中的值,我决定减少更改的影响。
def finding_smallest arr_arg
  @min = arr_arg.reduce do |min, el|
    el < min ? el : min
  end
end