Ruby tends to use two spaces for indents, rather than four.
for; it's very uncommon in Ruby and, while technically correct, doesn't make full use of Ruby's functionality. In the general case, you can replace
for a in b do
a.each do |b|
and the rest of the code is (probably) identical. For this case, however, since you're iterating over a range of integers, I'd suggest using
1.upto(a.length-1) do |i|
0.upto(sort_index) do |j|
Or, if you feel like you really should have
for a in b or
b.each do |a|, you can use
1...a.length to exclude the last element, instead of subtracting one.
Use more informative variable names --
j might make sense to you now, but it's rather difficult to understand if you don't already know how insertion sort works.
I don't see a difference between
i - 1, though I haven't had a chance to run it and test it yet.
You should return
a.length == 1, not nothing, since sorting a 1-item array is still sorting. Because the sort won't do anything, you can just remove the check entirely from the first
if and forget about it.
Sorts in Ruby should use
<=> instead of
<=> is the universal comparison operator. See the docs for
Object#<=> for more information.