我正在关注 Coursera 上的课程,并且正在尝试在 Ruby 中实现快速排序算法。我对 OOP 的语言和概念非常陌生。
我创建了两个函数:一个是调用分区例程的 quickSort 函数(根据作为数组的第一个元素的枢轴将数组拆分为两个子数组)。
最终,我会将这两个方法放在一个类 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
谢谢