2015-03-26 2 views
-2

Я пытался сортировать массив. Я знаю, что могу использовать sort_by, но я пытался реализовать его сам. Вот код:Итерация массива назад в последнюю позицию

def insertionSort(ar) 
    for i in 1..ar.length - 1 
    j = i 
    k = j - 1 
    while ar[j] < ar[k] && j != 0 do 
     temp = ar[k] 
     ar[k] = ar[j] 
     ar[j] = temp 
     k -= 1 
     j -= 1 
    end 
    puts ar.join(" ") 
    end 
end 

Когда программа достигает первую линию и декремент, она вернулась к последней позиции, так что while не ломается никогда. Я решил это с условием в while, чтобы проверить, является ли первая позиция.

Это нормально? Почему это происходит? Является ли массив похожим на список циклов, и когда я пытаюсь достичь позиции -1, использую ли я последнюю позицию?

+0

FYI: http://rosettacode.org/wiki/Sorting_algorithms/Insertion_sort#Ruby –

+0

Вы можете поменять переменные без ' temp' variable: 'ar [k], ar [j] = ar [j], ar [k]' – Stefan

+0

Я считаю, что вы не понимали, когда рубин использует циклический массив. Читайте, чтобы опубликовать, что @GaganGami прилагается в его комментарии. –

ответ

2

Нет, массивы в Ruby (как и другие языки) НЕ являются списком циклов.

Это синтаксис сахара. Отрицательный индекс относится к концу массива. индекс -1 указывает последний элемент массива, -2 является следующим последним элементом в массиве и т. д. Например:

arr = ['foo', 'bar', 42, :sym] 

arr[-1] таким же, как arr[3], arr[-2] такого же, как arr[2] и т.д.

+0

Я не думаю, что «синтаксический сахар» - правильный термин. – Stefan

1

... он вернулся к последней позиции

Когда accessing elements , отрицательные индексы начинают отсчет с конца, то есть ar[-1] - последний элемент.

... так что while не ломается.

Если Ruby не разрешил отрицательные индексы, в итоге вы получите IndexError. В любом случае вам понадобится j != 0, чтобы обеспечить прорыв вашего цикла при достижении первого элемента.

Вот еще один способ, чтобы написать его, используя upto и downto цикл:

def insertion_sort(a) 
    1.upto(a.size-1) do |i| 
    i.downto(1) do |j| 
     break unless a[j] < a[j-1] 
     a[j], a[j-1] = a[j-1], a[j] 
    end 
    end 
end 

array = [3, 7, 4, 9, 5, 2, 6, 1] 
insertion_sort(array) 
array #=> [1, 2, 3, 4, 5, 6, 7, 9] 
Смежные вопросы