示例代码纯粹是为了加深印象,选择的目标语言有更便捷的实现方式,另外去掉了一些假设条件检查。
#encoding:gbk
NElement = 20
NRadix = 4
K = 5
arr = Array.new(NElement) do #初始化待排序数组,随机填写元素
Array.new(NRadix) do
rand(K)
end
end
def counting_sort(a,b,r,k)
c = Array.new(k + 1,0) #下标数组
a.each do |x|
c[x[r]] += 1 #计数
end
c.each_with_index do |x,i|
next if i == 0
c[i] += c[i - 1] #累计计数
end
a.reverse.each do |x|
function(){ //K线图 http://www.kaifx.cn/mt4/kaifx/1770.html
b[c[x[r]] - 1] = x #放置元素
c[x[r]] -= 1 #为相同输入挪动下标,这里是往前挪,所以在基数排序中多次排序需逆向输入元素
end
end
def radix_sort(a,r,k)
b = Array.new(a.size,nil)
(r - 1).downto 0 do |ri|
counting_sort(a,b,ri,k)
a = b
end
b
end
a = arr.clone #输入数组
b = radix_sort(a,NRadix,K)
arr.each do |x|
puts x.inspect
end
puts '-'*10
b.each do |x|
puts x.inspect
End
输出如下:
---------- Ruby ----------
[2, 4, 3, 3]
[2, 3, 4, 0]
[1, 0, 3, 3]
[3, 1, 0, 2]
[2, 2, 3, 1]
[2, 0, 0, 0]
[4, 2, 3, 1]
[1, 1, 2, 3]
[2, 0, 2, 0]
[1, 0, 0, 3]
[4, 2, 1, 0]
[4, 3, 2, 2]
[2, 0, 2, 1]
[1, 0, 4, 3]
[0, 2, 2, 0]
[1, 2, 0, 2]
[1, 0, 1, 1]
[4, 0, 2, 3]
[1, 2, 0, 1]
[1, 1, 3, 3]
----------
[0, 2, 2, 0]
[1, 0, 0, 3]
[1, 0, 1, 1]
[1, 0, 3, 3]
[1, 0, 4, 3]
[1, 1, 2, 3]
[1, 1, 3, 3]
[1, 2, 0, 1]
[1, 2, 0, 2]
[2, 0, 0, 0]
[2, 0, 2, 0]
[2, 0, 2, 1]
[2, 2, 3, 1]
[2, 3, 4, 0]
[2, 4, 3, 3]
[3, 1, 0, 2]
[4, 0, 2, 3]
[4, 2, 1, 0]
[4, 2, 3, 1]
[4, 3, 2, 2]
Output completed (0 sec consumed) - Normal Termination |
|