示例代码纯粹是为了加深印象,选择的目标语言有更便捷的实现方式,另外去掉了一些假设条件检查。
#encoding:gbk
Size = 20
arr = Array.new(Size) do #初始化待排序数组,随机填写元素
rand(Size)
end
def merge(a,p,q,r)
one = a[p,q - p + 1] #括弧中第二参数是元素个数,容易坑
two = a[q + 1,r - q]
one << Float::INFINITY
two << Float::INFINITY
i = j = 0
for k in p..r
if one[i] < two[j]
a[k] = one[i]
i += 1
else
a[k] = two[j]
j += 1
end
end
end
def merge_sort(a,p,r)
if p < r
q = (p + r) / 2
merge_sort(a,p,q) #递归合并
merge_sort(a,q + 1,r)
merge(a,p,q,r)
end
end
puts arr.inspect
arrc = arr.clone
merge_sort(arrc,0,arrc.size - 1)
puts arrc.inspect
输出如下:
---------- Ruby ----------
[2, 1, 16, 4, 16, 9, 8, 0, 7, 16, 4, 16, 9, 5, 14, 5, 10, 12, 17, 11]
[0, 1, 2, 4, 4, 5, 5, 7, 8, 9, 9, 10, 11, 12, 14, 16, 16, 16, 16, 17]
Output completed (0 sec consumed) - Normal Termination