示例代碼純粹是爲了加深印象,選擇的目標語言有更便捷的實現方式,另外去掉了一些假設條件檢查。
#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