在Ruby中制作我自己的排序方法

时间:2013-11-23 03:16:58

标签: ruby sorting methods

所以我是编程的新手,我正在研究Chris Pine的Learn to Program,它教授Ruby。我正在第10章尝试为数组创建自己的方法。我完全失去了,并尝试使用他建议的答案进行建模。摆弄后,我无法得到输出。我运行该程序,它只是结束。我甚至尝试使用他的代码,它给了我同样的问题。

这是我到目前为止所拥有的。

unsorted_array = ['gamma', 'delta', 'beta', 'alpha', 'zeta']
sorted_array = []

def sort some_array 
  recursive_sort(some_array, [])
end


def recursive_sort(unsorted_array, sorted_array) 
  if unsorted_array.length <= 0
    return sorted_array 
  end

  still_unsorted =[]
  smallest = unsorted_array.pop
  sorted_array = []

  unsorted_array.each do |tested_obj|
    if '#{tested_obj}' > smallest
      sorted_array.push(smallest)
    else
      still_unsorted.push(smallest)
      smallest = unsorted_array.pop
    end
  end
    recursive_sort(still_unsorted, sorted_array)
end


puts sort(recursive_sort(unsorted_array, sorted_array))

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

以下是对您的代码的一些观察:

  • 由于test_obj是一个字符串,'#{tested_obj}'#{tested_obj}相同,与tested_obj相同。
  • 声明sorted_array = []无效。作为局部变量,它不在方法recursive_sort的范围内。该方法接收一个它调用sorted_array的数组,因此您无论如何都不希望它被初始化。
  • 您无需创建新数组still_unsorted;只需将元素从unsorted_array转移到sorted_array即可。

下面我修复并收紧了你的代码。

  def recursive_sort(unsorted_array, sorted_array = []) 
    return sorted_array unless unsorted_array.length > 0
    smallest = unsorted_array.min 
    unsorted_array.each {|e| sorted_array << e if e == smallest}
    unsorted_array.delete(smallest)
    recursive_sort(unsorted_array, sorted_array)
  end

  unsorted_array = ['gamma', 'alpha', 'delta', 'beta', 'gamma', 'alpha', 'zeta']
  p recursive_sort unsorted_array
    #  => ["alpha", "alpha", "beta", "delta", "gamma", "gamma", "zeta"]

以下是发生的事情:

  • 通过给recursive_sort(sorted_value)的第二个参数设置一个默认值[](一个空数组),不需要你以前的方法sort
  • 如果排序完成,则返回
  • sorted_array(与return sorted_array if unsorted_array.length == 0相同)。
  • 使用Enumerable#min查找未排序项目的最小值(smallest)。
  • smallest中的unsorted_array的每个实例添加到sorted_array
  • 删除smallestunsorted_array的所有实例。
  • 再次调用相同的方法,删除下一​​个最小的未分类项目等。

请注意

  unsorted_array.each {|e| sorted_array << e if e == smallest}

可以用许多不同的方式表达。这是一个:

  sorted_array += [smallest]*(unsorted_array.count {|e| e == smallest})

要了解其工作原理,请假设smallest = 'alpha'。然后

  unsorted_array.count {|e| e == 'alpha'} # => 2

所以上面的表达是:

  sorted_array += ['alpha']*2

  sorted_array += ['alpha', 'alpha']

将两个"alpha"添加到sorted_array