【发布时间】:2016-12-13 02:16:43
【问题描述】:
我正在学习一些 Ruby 中的排序算法,并学习了快速排序的这种递归实现:
class Array
def quicksort
return [] if empty?
pivot = delete_at(rand(size))
left, right = partition(&pivot.method(:>))
return *left.quicksort, pivot, *right.quicksort
end
end
array = [5,3,2,18,1,6,4,7,5,9,0]
p array
#=> [5, 3, 2, 18, 1, 6, 4, 7, 5, 9, 0]
p array.quicksort
#=> [0, 1, 2, 3, 4, 5, 5, 6, 7, 9, 18]
我想我基本上明白这里发生了什么。我有这个权利吗?
选择任意枢轴,存储数字并从数组中删除该索引。然后对数组进行分区,将数字> pivot 放入数组left,将数字< pivot 放入right。 Return pivot 并在 left 和 right 数组中递归调用快速排序(如果其中有任何内容)。
我不明白的是最终数组是如何构造的;我没有看到返回的数字在哪里分配了适当的索引。返回pivot 时会发生这种情况吗?它如何最终出现在正确的索引中?
我认为我的一些困惑来自于对递归缺乏了解。
提前感谢您的帮助。
【问题讨论】:
标签: arrays ruby algorithm sorting recursion