试着写排序方法

时间:2011-06-16 04:55:19

标签: ruby sorting methods recursion

尝试使用递归编写自己的排序方法对数组进行排序(Pine的书)。在stackoverflow上看到了一些其他的例子,但我的代码看起来与它们不同。到目前为止我还不了解的两件事:

  1. 什么是包装方法,为什么需要一个? (我想在代码中加入)。
  2. 如何修复“堆栈级太深”错误。
  3. 编辑:新代码已更新,正常但无效。

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

    def word_sorter unsorted, sorted
      if unsorted[1] == nil
        sorted.push unsorted[0]
        words_put(sorted)
      elsif unsorted[0] <= unsorted[1]
        sorted.push unsorted[0]
        unsorted.shift
        word_sorter(unsorted, sorted)
      else
        unsorted.push unsorted[0]
        unsorted.shift
        word_sorter(unsorted, sorted)
      end
    end
    
    def words_put sorted
      puts 'these are your words now organized.'
      sorted.compact!
      puts sorted.join(', ')
      Process.exit
    end
    
    unsorted = Array.new
    sorted = Array.new
    puts 'list as many words as you want. I will sort them... I think'
    while unsorted.last != ''
      unsorted.push gets.chomp
      if unsorted.last == ''
        unsorted.pop
        word_sorter(unsorted, sorted)
      end
    end
    

    谢谢!

3 个答案:

答案 0 :(得分:2)

1)这里没什么特别的。我们使用简单的英语(尽管比喻)。包装器方法是一种包装器的方法。包装是包装的东西。您正在使用word_sorter方法包装sort方法。为方便起见,你“需要”它:sort方法从外部调用它时,期望第二个参数的空列表是很奇怪的。包装考虑到这样一个事实,即递归的明显界面与外界的明显界面不同。

2)仔细研究处理unsorted[0] >= unsorted[1]的代码与else案例的区别(即unsorted[0] < unsorted[1]时)。

3)首先尝试用英语描述你的算法。然后试着拿出一些扑克牌并按照它来测试你的算法。

4)只需要调用一次工作排序算法。因此,在读入所有要排序的值之后,找出一个合适的排序算法,然后只调用一次 - 在循环之外。您可能还想实际调用words_put

答案 1 :(得分:0)

“堆栈级别太深”意味着您正在进行无限递归。在word_sorter的任何分支中,未排序的列表看起来都不会变短,所以它会一直运行。

答案 2 :(得分:0)

您应该首先通过一些简单的示例来尝试您的代码。例如。使用列表[3,2,1]作为输入。

在第一次通话中,它将匹配3>=2条件。现在sorted=[2]

这个问题已经存在两个问题了。

  1. 2不是排序列表中的第一个条目。您的算法必须存在无法对任何输入进行排序的问题。
  2. 数组unsorted根本没有改变,因此它将永远与此循环,产生sorted=[2,2,2,2,2.....]