如何在Ruby中编写合并排序算法

时间:2014-05-24 22:09:35

标签: ruby algorithm bash mergesort

我正在尝试在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得到了这个。

2 个答案:

答案 0 :(得分:0)

c=[]行是正确的。保持原样。

merge方法用于将2个已排序的数组ab合并在一起。它由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