我正在实施CLRS中的一些内容,而partition()
算法让我有点担心。暗示(从其中一致模糊的伪代码,但没有明确说明)partition
应修改它传递的数组,并返回相关的标量值:
PARTITION(A, p, r)
1 x = A[r]
2 i = p -1
3 for j = p to r - 1
4 if A[j] <= x
5 i = i + 1
6 swap A[i], A[j]
7 swap A[i+1], A[r]
8 return i + 1
这很容易在Ruby中放在一起,但我的问题是,因为它改变了数组而没有返回它,它是否应该像array.do_stuff!()
这样的类方法?
irb(main):007:0> ary
=> [0, 3, 0, 2, 1, 2, 2, 2, 4, 4, 2]
irb(main):008:0> partition(ary,2,4)
=> 3
irb(main):009:0> ary
=> [0, 3, 0, 1, 2, 2, 2, 2, 4, 4, 2]
供参考,这是我的代码:
def partition(my_list, part_start, part_end, pivot = my_list[part_end])
# From CLRS p. 171
# In-place rearrangement of subarrays.
sort_separator = part_start - 1
for loop_ind in (part_start..part_end-1)
if my_list[loop_ind] <= my_list[part_end]
sort_separator += 1
my_list[sort_separator],my_list[loop_ind] =
my_list[loop_ind],my_list[sort_separator]
end
end
my_list[sort_separator+1],my_list[part_end] =
my_list[part_end],my_list[sort_separator+1]
return(sort_separator+1)
end