我正在ruby中做快速排序,并使用quick_sort我正在抓取数组的最后3个元素并将其相乘以获得值。
我的快速排序工作得很好,但唯一的事情是,当我在quick_search
中调用我的另一个方法max_product_three
时,我传递给该方法的sorted_array
只显示为两个随机数,如[-3,-2]
。如果我从quick_search中取出我的方法,它会给出正确的输出。发生了什么,当我把我的方法排序数组是错误的,这是导致我的max_product_three
不工作。
quick_search.rb
def quick_search(array)
return array if array.length <= 1
len = array.length - 1
left = []
right = []
pivot = array.sample
array.delete_at(array.index(pivot))
array.each do |num|
if num < pivot
left << num
else
right << num
end
end
sorted = []
sorted << quick_search(left)
sorted << pivot
sorted << quick_search(right)
sorted_array = sorted.flatten
p sorted_array
max_product_three(sorted_array)
end
max_product_three.rb
def max_product_three(sorted_array)
len = sorted_array.length - 1
take_3 = len - 3
mulitple = sorted_array.drop(take_3)
p mulitple.inject(:*)
end
我使用这个数组作为参考[-3,1,2,-2,5,6]
我想你写这篇文章是为了了解快速排序是如何工作的?因为ruby有一个#sort
方法。😁
这里的东西很少。你打算做两件事:首先,对数组进行排序;其次,将排序数组中最大的三个值相乘?因为这不是你的代码当前所做的。你从排序中调用max_product_three
方法,这意味着每次调用quick_sort
时都会调用它。
更糟糕的是,它是方法中的最后一行。这意味着调用max_product_three
的结果是每次迭代时返回的结果,而不是排序后的数组!因此,对于每个子排序,您返回的是单个数字,而不是排序后的数组。
max_product_three
方法乘以最后的4值,而不是最后的3个值。(你从它的长度减去1,然后减去3,所以你减去长度- 4个值,留下4个值相乘。)
您不需要在quick_search方法的末尾执行p sorted_array
(大概应该是quick_sort
!),但可以只使用sorted_array
返回数组。
并且,更小的事情是,如果不使用显式操作符,您的初始保护子句会更好(也更像红宝石),例如:
return array unless array.length.positive?
这是相当多的,我可能误解了你在这里想要做的事情,所以如果我有的话请告诉我!