这是ruby中插入排序的正确实现吗?

时间:2014-07-14 23:11:16

标签: ruby sorting insertion-sort

我正在尝试进行数组练习问题,而且我现在正在进行插入排序。我想知道这段代码是否清晰可读。对我来说,这看起来有点令人困惑,如果有人有更清洁的方式(更容易理解)来实现这个,你可以帮我吗?

def insertion_sort(arr)
(1...arr.length).each do |i| #iterate through array go through every element
    j=i-1 #to check all elements behind i
    while(j>=0&&arr[i]<arr[j]) #while not out bounds and current element is less than previous
        temp=arr[i] #3 lines to switch arr[i] and arr[j]
        arr[i]=arr[j]
        arr[j]=temp
        i=j #keep track of where i is 
        j-=1 #decrease j by 1 to check the previous element
    end
end
return arr
end

3 个答案:

答案 0 :(得分:1)

这在ruby中不是必需的:

temp=arr[i] #3 lines to switch arr[i] and arr[j]
arr[i]=arr[j]
arr[j]=temp

因为你可以做这样的多项任务:

a,b = 1,2

与:

相同
a = 1
b = 2

这意味着你可以像这样切换变量值:

a,b = b,a

或在你的情况下:

arr[i],arr[j] = arr[j],arr[i]

答案 1 :(得分:0)

这可能有它自己的问题,但你可以在这里看到一些简化希望使代码更具可读性。

class Array
  def swap(a, b)
    self[a], self[b] = self[b], self[a]
  end
end


def insertion_sort(arr)
    (1...arr.size).each do |i|
        i.downto(1).each do |j|
            break if arr[j] >= arr[j - 1]
            arr.swap(j, j - 1)
        end
    end
    arr
end

答案 2 :(得分:0)

在ruby中轻松实现插入排序。

def insertion(arr)
  for i in (1...(arr.size))
    if arr[i-1] > arr[i]
      i.downto(1) do |el|
        if arr[el] < arr[el-1]
          arr[el-1], arr[el] = arr[el], arr[el-1]
        end
      end
    end
  end
  arr
end

arr = %w(3 7 4 9 5 2 6 1 0)

p insertion(arr)