我正在尝试在Ruby中编写合并排序算法。当我在bash中执行这个脚本时,我得到'nil'作为回报。我猜我需要一组数字,所以我在“c = [...”之后放置了“6,1,8,4,9,3”。
以下是代码:
def merge (a,b)
index_a=0
index_b=0
c=[6,1,8,4,9,3]
while index_a<a.length and index_b<b.length do
if a[index_a]<=b[index_b] then
c<<a[index_a]
index_a=index_a+1
else
c<<b[index_b]
index_b=index_b+1
end
end
if(index_a<a.length) then
for i in(index_a..a.length-1) do
c<<a[i]
end
else
for i in(index_b..b.length-1) do
c<<b[i]
end
end
return c
end
def msort(list)
return list if list.length==1 #base cases
halfway=list.length/2
list1=list[0..halfway-1]
list2=list[halfway..list.length-1]
newlist1=msort(list1) #recursive!
newlist2=msort(list2) #recursive!
newlist=merge(newlist1,newlist2)
return newlist
end
作为参考,我从CMU lecture slide得到了这个。
答案 0 :(得分:0)
c=[]
行是正确的。保持原样。
merge
方法用于将2个已排序的数组a
和b
合并在一起。它由msort
中的排序算法使用。
msort
应该将未排序的数组作为参数。所以把它叫做
p msort([6,1,8,4,9,3])
在文件的末尾。
答案 1 :(得分:0)
def mergesort(container)
return container if container.size <= 1
mid = container.size / 2
left = container[0...mid]
right = container[mid...container.size]
merge(mergesort(left), mergesort(right))
end
def merge(left, right)
sorted = []
until left.empty? or right.empty?
sorted << (left.first <= right.first ? left.shift : right.shift)
end
sorted + left + right
end