数组迭代回到最后位置

时间:2015-03-26 03:06:37

标签: ruby arrays

我正在尝试对数组进行排序。我知道我可以使用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位置时,我是否使用了最后一个位置?

2 个答案:

答案 0 :(得分:2)

不,Ruby中的数组(与其他语言一样)不是循环列表。

这是语法糖。负索引相对于数组的末尾。索引-1表示数组的最后一个元素,-2是数组中倒数第二个元素,依此类推。例如:

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

arr[-1]arr[3]相同,arr[-2]arr[2]相同,等等。

答案 1 :(得分:1)

  

......它又回到了最后一个位置

accessing elements时,负指数从结束开始计算,即ar[-1]是最后一个元素。

  

...所以while并没有打破。

如果Ruby不允许负指数,那么最终会得到IndexError。无论哪种方式,您都需要j != 0来确保在到达第一个元素时循环中断。

以下是使用uptodownto循环编写它的另一种方式:

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]