2016-06-26 61 views
0

我在Ruby中編寫Quicksort算法時遇到了很多問題。我是從C++/Java的未來,所以我的代碼可能是完全錯誤的:Ruby中Quicksort的問題

def quicksort(*list) 

    if list.empty? 
     return list 
    end 

    $pivot = list.sample 

    list.delete_at(list.index($pivot)) 

    current_element = list[0] 

    $smaller = Array.new 
    $larger = Array.new 


    list.each do |x| 
     if (list[x] <= $pivot) 
     $smaller << list[x] 
     else 
     $larger << list[x] 
     end 
    end 

    $sorted = Array.new 

    $sorted << self.quicksort(*$smaller) 
    $sorted << pivot 
    $sorted << self.quicksort(*$larger) 

    $sorted.flatten! 

    return *$sorted 
end 

myArray = [5, 4, 3, 2, 1] 
sorted = Array.new(quicksort(myArray)) 

myArray.each do |x| 
print x 
end 

print "\n" 

這是我得到的錯誤:

My error

你能不能設置相同的數組到一個返回數組的函數,就像在C++或Java中一樣?

+1

請將錯誤添加爲文本,而不是圖像 – AlBlue

+0

對不起,您是否看過錯誤信息?你從哪裏得到這樣的印象:錯誤信息與「設置一個返回數組的函數相等的數組」有什麼關係?我認爲錯誤信息非常明確:您將'quicksort'定義爲'private'方法,但您並未將其稱爲「private」方法。您需要將其稱爲「私人」方法,即沒有明確的接收方。 –

+0

一些想法:ruby中的'$ foo'是一個全局變量。它看起來不像你的函數中的任何變量都需要是全局的。事實上,它們可能會給你帶來麻煩,因爲每次遞歸調用函數'$ sorted'時都會被覆蓋。當你在'def quicksort(* list)'中使用splat運算符時,你將'list'的每個元素作爲單獨的參數傳遞,而不是傳遞整個列表。我不認爲這是你想要的。同樣,只需返回'$ sorted'而不是'* $ sorted'。 – lwassink

回答

0

編輯你的代碼你must have a class to define methods in IRB。另外,我在調整之前修正了缺失美元的錯誤。

class SortingAlgorithms 
    def self.quicksort(*list) 

    if list.empty? 
     return list 
    end 

    $pivot = list.sample 

    list.delete_at(list.index($pivot)) 

    current_element = list[0] 

    $smaller = Array.new 
    $larger = Array.new 


    list.each do |x| 
     if (list[x] <= $pivot) 
     $smaller << list[x] 
     else 
     $larger << list[x] 
     end 
    end 

    $sorted = Array.new 

    $sorted << self.quicksort(*$smaller) 
    $sorted << $pivot 
    $sorted << self.quicksort(*$larger) 

    $sorted.flatten! 

    return *$sorted 
    end 
end 


myArray = [5, 4, 3, 2, 1] 
sorted = Array.new(SortingAlgorithms.quicksort(myArray)) 

myArray.each do |x| 
    print x 
end 

print "\n" 

但是,美麗的紅寶石方式在另一個thread提供。