算法回鍋肉——歸併排序

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

#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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章