2016-06-26 12 views
0

RubyでQuicksortアルゴリズムを書く際に問題がたくさんあります。RubyでのQuicksortの問題

My error

はあなたが同じ配列を設定することはできません:これは私が得ているエラーがある

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" 

:私のコードは完全に間違っている可能性がので、私は、C++/Javaのから来ていますあなたはC++やJavaのように、配列を返す関数に?

+1

画像としてではなく、エラーとしてテキストを追加してください。 – AlBlue

+0

申し訳ありませんが、エラーメッセージも読んでいますか?エラーメッセージに「配列を返す関数と等しい配列を設定する」とは何か関係があるという印象はどこで得られますか?私は、エラーメッセージは非常に明確だと思います: 'quicksort'を' private'メソッドとして定義しましたが、あなたは '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を提供します。