【发布时间】:2019-03-23 08:37:54
【问题描述】:
我正在尝试在 Ruby 中创建一个没有排序功能的排序算法。我基于插入排序的想法。这个想法是该函数检查每两个单词的第 n 个值是否相同,如果是,则 n 增加 1 直到一个值大于另一个值。在这种情况下,单词可能会被切换。但是,我的功能一直冻结。任何想法为什么?
words = ["my","favorite","animal", "are", "the", "elephant", "and", "the", "antelope", "and", "the", "favela"]
#Convert all letters into numbers. Output individual words as arrays.
converted_words = words.map(&:chars).map { |letters| letters.map { |letter| letter.to_i 36 } }
puts converted_words.to_s
i = 1
x = 0
while i < converted_words.length
if converted_words[i][x] == converted_words[i-1][x]
x = x + 1
else
if converted_words[i][x] < converted_words[i-1][x]
converted_words[i], converted_words[i-1] = converted_words[i-1], converted_words[i]
i = 0
x = 0
else
i = i + 1
end
end
end
puts converted_words.to_s
【问题讨论】:
-
能否请您对输出进行示例?
-
如果不增加
i,函数将永远循环。 -
@Benisburgers:你确定吗?
-
正如@YvesDaoust 指出的那样,在某些情况下您不会增加
i。而且,是的,x有问题。无论何时更改i,都必须重置x。此外,如果您设置i=0,然后尝试访问converted_words[i-1][0],您将离开阵列的后端。而且您没有终止条件来停止在单词的末尾。您需要启动调试器并单步执行您的代码,以查看它在哪里偏离了轨道。 -
另外,这里有一种效率极低的排序算法,与插入排序几乎没有相似之处。如果我正确地阅读了意图,你会向前搜索,直到你找到一个不合适的项目。您交换项目,然后从头开始。因此,如果您想将一个项目从数组的末尾移动到开头,则需要
n遍历数组。这构成了一个 O(n^3) 算法。给定一个足够大的数组,它实际上不会进入无限循环;它看起来就像一个无限循环。
标签: ruby algorithm sorting insertion-sort