Coursera のクラスをフォローしており、Ruby でクイックソート アルゴリズムを実装しようとしています。私は言語と OOP の概念に非常に慣れていません。
2 つの関数を作成しました。1 つはパーティション ルーチンを呼び出す quickSort 関数です (配列の最初の要素であるピボットに従って、配列を 2 つのサブ配列に分割します)。
最終的には、これら 2 つのメソッドをクラス Array の下に配置しますが、今のところ、これで問題ないと判断しました。
これを配列 (a = [5, 4, 3, 2, 1]) で実行しようとしましたが、次のエラーが発生しました。
A2.rb:16:in `partition': undefined method `<' for true:TrueClass (NoMethodError)
from A2.rb:15:in `each'
from A2.rb:15:in `partition'
from A2.rb:33:in `quickSort'
これが私のコードです:
def partition(array, left_idx, right_idx)
num_comp = array.length - 1
p = array[left_idx]
i = left_idx + 1
j = left_idx + 1
puts "#{left_idx}, #{right_idx}, #{array[j]} #{j}"
puts "pivot = #{p}"
for j in (left_idx + 1..right_idx)
if (left_idx < j < right_idx and left_idx < i < right_idx)
if (array[j] > p)
j = j + 1
else
array[i], array[j] = array[j], array[i]
i = i + 1
j = j + 1
end
end
end
#swap pivot and rightmost value in subarray that contains < p
array[1], array[i] = array[i], array[1]
pivot_idx = i
return array, num_comp, pivot_idx
end
def quickSort(array, start_idx, end_idx)
array_n, num_comp, pivot_idx = partition(array, start_idx, end_idx)
left_array = array_n[start_idx..pivot_idx - 1]
right_array = array_n[pivot_idx + 1..end_idx]
if (left_array.length > 1)
array_n = quickSort(array_n, start_idx, pivot_idx - 1)
end
if (right_array.length > 1)
array_n = quickSort(array_n, pivot_idx + 1, end_idx)
end
return array
end
#a = Array.new()
a = [5, 4, 3, 2, 1]
quickSort(a, 0, 4)
print "Array"
puts a
ありがとう