比较数组中的两个连续元素
Compare two consecutive elements in an array
我想创建一个"bubble sort"方法,这意味着我在一个数组中取两个连续的元素,比较它们,如果左边的元素大于右边的元素,他们应该交换位置。我想重复它,直到我的数组按升序排序。
我的代码只能部分工作。如果我的数组太大,则什么也不会发生(我必须使用 CTRL + C 退出 ruby)。对于小于 5 个元素的数组,我的代码工作正常:
def bubbles(array)
while array.each_cons(2).any? { |a, b| (a <=> b) >= 0 }
# "true" if there are two consecutives elements where the first one
# is greater than the second one. I know the error must be here somehow.
array.each_with_index.map do | number, index |
if array[index + 1].nil?
number
break
elsif number > array[index + 1]
array[index], array[index + 1] = array[index + 1], array[index] # Swap position!
else
number
end
end
end
p array
end
如果我用一个包含 4 个元素的数组调用我的方法,它工作正常:
bubbles([1, 5, 8, 3]) # => [1, 3, 5, 8]
如果我用更大的数组调用它,它就不起作用:
bubbles([5, 12, 2, 512, 999, 1, 2, 323, 2, 12]) # => Nothing happens. I have to quit ruby with ctrl + c.
我是否以某种方式用我的 while 语句创建了一个无限循环?
问题出在你的停止条件上。你不会停止,直到你有一个数组,其中每个元素都比下一个元素 less。但是在你的长数组中你有重复的元素,所以排序后的元素将有相邻的元素 相等 彼此。
不要太花哨你的代码会让你的生活更轻松:)
while array.each_cons(2).any? { |a, b| a > b }
我建议您确定数组是否在单独的方法中排序(并且不要从方法中打印数组:
def bubbles(array)
until ordered?(array)
...
end
array
end
这是定义 ordered?
的一种方法(在许多方法中):
def ordered?(array)
enum = array.to_enum
loop do
return false if enum.next > enum.peek
end
true
end
ordered? [1,2,3,4,5] #=> true
ordered? [1,2,4,3,4] #=> false
此外,您的代码改变了它接收到的参数 (array
),这可能是不可取的。您可以通过处理副本来避免这种情况,array.dup
.
我想创建一个"bubble sort"方法,这意味着我在一个数组中取两个连续的元素,比较它们,如果左边的元素大于右边的元素,他们应该交换位置。我想重复它,直到我的数组按升序排序。
我的代码只能部分工作。如果我的数组太大,则什么也不会发生(我必须使用 CTRL + C 退出 ruby)。对于小于 5 个元素的数组,我的代码工作正常:
def bubbles(array)
while array.each_cons(2).any? { |a, b| (a <=> b) >= 0 }
# "true" if there are two consecutives elements where the first one
# is greater than the second one. I know the error must be here somehow.
array.each_with_index.map do | number, index |
if array[index + 1].nil?
number
break
elsif number > array[index + 1]
array[index], array[index + 1] = array[index + 1], array[index] # Swap position!
else
number
end
end
end
p array
end
如果我用一个包含 4 个元素的数组调用我的方法,它工作正常:
bubbles([1, 5, 8, 3]) # => [1, 3, 5, 8]
如果我用更大的数组调用它,它就不起作用:
bubbles([5, 12, 2, 512, 999, 1, 2, 323, 2, 12]) # => Nothing happens. I have to quit ruby with ctrl + c.
我是否以某种方式用我的 while 语句创建了一个无限循环?
问题出在你的停止条件上。你不会停止,直到你有一个数组,其中每个元素都比下一个元素 less。但是在你的长数组中你有重复的元素,所以排序后的元素将有相邻的元素 相等 彼此。
不要太花哨你的代码会让你的生活更轻松:)
while array.each_cons(2).any? { |a, b| a > b }
我建议您确定数组是否在单独的方法中排序(并且不要从方法中打印数组:
def bubbles(array)
until ordered?(array)
...
end
array
end
这是定义 ordered?
的一种方法(在许多方法中):
def ordered?(array)
enum = array.to_enum
loop do
return false if enum.next > enum.peek
end
true
end
ordered? [1,2,3,4,5] #=> true
ordered? [1,2,4,3,4] #=> false
此外,您的代码改变了它接收到的参数 (array
),这可能是不可取的。您可以通过处理副本来避免这种情况,array.dup
.