我正在尝试对数组进行排序。我知道我可以使用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 :(得分: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
来确保在到达第一个元素时循环中断。
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]