2014-07-14 85 views
-1

我正在嘗試做陣列練習問題,我現在正在進行插入排序。我想知道這段代碼是否清晰可讀。對我來說,它看起來有點混亂,如果有人有更清晰的方式(更容易理解)來實現這一點,你可以幫我嗎?這是插入排序在紅寶石的正確實施

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 
+0

立即想到的是,你的縮進是可怕的,因此不容易閱讀。在stackoverflow上,Ruby的通用縮進規則是插入兩個空格。而且它很糟糕,因爲你沒有在二元關係/等號的周圍放置空格。 – sawa

+1

此問題屬於[代碼評論](http://codereview.stackexchange.com/?as=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 
1

這是沒有必要的紅寶石:

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] 
0

在紅寶石中輕鬆實現插入排序。

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)