array = [4, 7, 2, 1]
sorted = false
until sorted == true
swapped = false
array.each_with_index do |x, i|
if i <= array.length - 2
if array[i] > array[i + 1]
array[i], array[i + 1] = array[i + 1], array[i]
swapped = true
end
end
if swapped == false
sorted = true
end
end
end
print array
您好,我正在尝试使用冒泡排序对数字数组进行排序。但它没有排序。有人可以帮助我实现这一点,并指出我的错误在哪里?
答案 0 :(得分:1)
您应该在循环之后放置下面的部分,因为如果在遍历数组后没有交换,则要停止。
if swapped == false
sorted = true
end
您也可能希望使用sorted
摆脱不必要的break
。这是我的变体:
array = [4, 7, 2, 1]
loop do
swapped = false
(array.length - 1).times do |i|
if array[i] > array[i + 1]
array[i], array[i + 1] = array[i + 1], array[i]
swapped = true
end
end
break unless swapped
end
print array
答案 1 :(得分:1)
(原始)代码有两个主要问题:
unless sorted == true
,这使它只运行一次;您必须将其更改为until sorted == true
; swapped == false
的检查必须在 array.each
后保持。它的目的是在再次分析列表后没有进行交换时发出数组已排序(并结束循环)的信号。1 在我在评论中提出这一更正后,OP同时编辑了这个问题。
固定代码:
array = [4,7,2,1]
sorted = false
until sorted == true
swapped = false
array.each_with_index do |x,i|
if i <= array.length - 2
if array[i] > array[i+1]
array[i], array[i+1] = array[i+1], array[i]
swapped = true
end
end
end
if swapped == false
sorted = true
end
end
print array
在这段代码中,很多东西都不符合Ruby的精神。我没有经验丰富的Ruby,但我可以建议你做一些改进。
# Enclose the code into a function, for easier reuse.
def bubble_sort(array)
sorted = false
# "sorted" is boolean; there is no need to compare it with true or false
until sorted
swapped = false
array.each_with_index do |x,i|
# exit the loop when the last item is reached
break if i == array.length - 1
if array[i] > array[i+1]
array[i], array[i+1] = array[i+1], array[i]
swapped = true
end
end
# Boolean logic: it's sorted when no more items were swapped
sorted = ! swapped
end
# Return the updated array
array
end
print bubble_sort [4, 7, 2, 1]
@ danil-speransky刚刚提供了一个solution看起来更像Ruby而不是我的。