Ruby 返回到最后位置的数组迭代

Ruby 返回到最后位置的数组迭代,ruby,arrays,Ruby,Arrays,我试图对数组进行排序。我知道我可以使用排序依据,但我试图自己实现它。代码如下: 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

我试图对数组进行排序。我知道我可以使用
排序依据
,但我试图自己实现它。代码如下:

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
def insertionSort(ar)
对于1..ar.length-1中的i
j=i
k=j-1
而ar[j]
当程序到达第一行并递减时,它返回到最后一个位置,因此
while
不会中断。我用
中的一个条件解决了这个问题,同时
验证是否是第一个位置

这正常吗?为什么会发生这种情况?数组是否类似于循环列表,当我尝试达到-1位置时,是否使用最后一个位置?

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

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

arr = ['foo', 'bar', 42, :sym]
arr[-1]
arr[3]
相同,
arr[-2]
arr[2]
相同,等等

。。。它回到了最后一个位置

当负指数从末尾开始计数时,即,
ar[-1]
是最后一个元素

。。。因此,
while
不会中断

如果Ruby不允许使用负索引,那么您将得到一个
索引器。无论哪种方式,您都需要
j!=0
以确保循环在到达第一个元素时中断

下面是另一种编写方法,使用and和循环:

def插入\排序(a)
1.高达(a.size-1)度|
i、 下至(1)do|j|
除非a[j][1,2,3,4,5,6,7,9]

FYI:您可以在不使用
temp
变量的情况下交换变量:
ar[k],ar[j]=ar[j],ar[k]
我相信您不理解ruby何时使用循环数组。阅读后,将@GaganGami附在他的评论中。
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]