Значение настройки сортировки выбора в каждом цикле

Я пытаюсь найти наименьший элемент в массиве.

Я попытался сделать это с помощью метода finding_smallest следующим образом:

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)

Он возвращает наименьший элемент из предыдущего массива. Я думаю, проблема в том, что цикл each не устанавливает значение во второй раз (или в первый). Что я делаю неправильно?


person 11223342124    schedule 16.05.2017    source источник


Ответы (1)


@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

В ruby ​​мы используем для этого Enumerable#reduce:

def finding_smallest arr_arg
  @min = arr_arg.reduce do |min, el|
    el < min ? el : min
  end
end
person Aleksei Matiushkin    schedule 16.05.2017
comment
Вам вообще нужен @min? - person Stefan; 16.05.2017
comment
@Stefan Нет, но поскольку исходная реализация возвращала значение, хранящееся в переменной экземпляра, я решил уменьшить влияние своих изменений. - person Aleksei Matiushkin; 16.05.2017