Ruby,使用递归冒泡排序方法并完全卡住

时间:2014-03-10 01:41:12

标签: ruby arrays sorting recursion bubble-sort

所以我正在做Chris Pine的“学习编程”,而且我编写自己的递归排序方法时遇到了麻烦。

我一直在通过反复试验来缓慢(非常缓慢)进展......但现在我陷入了困境并且毫无头绪。这是代码:(我知道它有很多其他问题,但我会及时解决这些问题,只想在下面提出问题答案,谢谢)

array = ['v', 't','k','l','w','o','a','y','p','f','x','g','h','j','z']
sorted_array = []

def mySort(array, sorted_array)
    if array.length <= 0
        return
    end

    x = 0
    y = 0

    while y < array.length 
        if array[x] < array[y]
            y += 1
        elsif array[x] > array[y]
            x += y
            y += 1
        else
            y += 1
        end
    end

    sorted_array.push(array[x])
    array.delete(array[x])
    puts "test complete"
end

mySort(array, sorted_array)

如果给第一个元素而不是'v'给'b'数组它可以正常工作,否则跳过我的while循环并得到错误“undefined method'&lt;' for nil:NilClass“我强烈怀疑这个问题与我最后在数组上使用#delete方法有关,但是我真的不明白为什么我的while循环被跳过取决于我的数组中的元素? !?它对我来说没有意义,因为while循环的条件不是基于正在测试的字符串。

就像我之前说过的那样,我知道还有很多其他问题需要解决,然后才能使用一个有效的排序方法(一个递归),但我会尝试自己完成剩下的工作,这只是一件完全无法解决的问题。

谢谢!

编辑

因此,以下是可能会在以后发现并从中受益的任何人的工作顺序中的修补后代码....

array = ['v', 't', 'k', 'l', 'w', 'o', 'a', 'y', 'p', 'f', 'x', 'g', 'h', 'j', 'z']
sorted_array = []

def mySort(array, sorted_array)
    if array.length <= 0
        return
    end
    x = 0
    y = 0
    while y < array.length 
        if array[x] < array[y]
            y += 1
        elsif array[x] > array[y]
            x = y
            y += 1
        else
            y += 1
        end
    end
    sorted_array.push(array[x]) 
    array.delete(array[x])
    mySort(array, sorted_array)
end
mySort(array, sorted_array)

puts sorted_array
puts
puts array

1 个答案:

答案 0 :(得分:1)

我假设您忘记在函数定义结束时调用mySort,因为没有它,比较只会通过数组一次。如果没有内部调用,则没有nil:NilClass错误。 对我来说,错误的出现并不依赖于天气,第一个元素是'b'或'v',尽管这会改变程序失败的迭代次数。

这根本不是冒泡,它是一种选择排序。

这是罪魁祸首

x += y

应该是:

x = y

如果你有第一个版本,x可以变得比数组大,因此超出范围。试图获取一个超出数组范围的元素会导致nil。所以你的代码试图执行(例如):

'a' < nil

这正是错误所暗示的: NilClass类的对象(nil类,令人惊讶的是)没有'&lt;'方法即可。 nil没有实现比较,因为没有可以返回的好结果。如果您的代码结构不同,解释器会告诉您“String与nil的比较失败”,换句话说,它告诉我们同样的事情。