Arrays 在Ruby中使用气泡排序对数组进行排序 array=[4,7,2,1] 排序=假 直到排序==真 交换=错误 array.each_与_索引do | x,i| 如果i数组[i+1] 数组[i],数组[i+1]=数组[i+1],数组[i] 交换=真 结束 结束 如果交换==false 排序=真 结束 结束 结束 打印阵列
您好,我正在尝试使用冒泡排序对数字数组进行排序。但是它没有被分类。有人能帮我做到这一点并指出我的错误在哪里吗?你应该把这一块放在循环后的下面,因为如果你在遍历数组后没有交换,你想停止Arrays 在Ruby中使用气泡排序对数组进行排序 array=[4,7,2,1] 排序=假 直到排序==真 交换=错误 array.each_与_索引do | x,i| 如果i数组[i+1] 数组[i],数组[i+1]=数组[i+1],数组[i] 交换=真 结束 结束 如果交换==false 排序=真 结束 结束 结束 打印阵列,arrays,ruby,algorithm,sorting,Arrays,Ruby,Algorithm,Sorting,您好,我正在尝试使用冒泡排序对数字数组进行排序。但是它没有被分类。有人能帮我做到这一点并指出我的错误在哪里吗?你应该把这一块放在循环后的下面,因为如果你在遍历数组后没有交换,你想停止 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
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
您还可能希望使用break
清除不必要的排序
。以下是我的变体:
if swapped == false
sorted = true
end
(原始)代码有两个主要问题:
- 主块应重复,直到列表排序。除非sorted==true,否则您使用的是1
,这使得它只运行一次;您必须将其更改为
李>,直到sorted==true
- 对
的检查必须在swaped==false
数组之后保持。每个
。它的目的是在再次分析列表后未进行交换时,向数组发出排序(并结束循环)的信号
- 对
在我在评论中提出这一更正之后,OP同时编辑了这个问题 固定代码:
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
@danil speransky刚刚提供了一个看起来更像Ruby的数组。@axiac我已经将
更改为,直到,但是我意识到如果我更改数组中的数字,代码将无法工作。以前的array=[4,3,2,1],现在的array=[4,7,2,1]@sawa我已经编辑了这个问题,希望它更清楚。if swaped==false
块必须留在数组之后。对于我们来说,每个的“我不能做”都不是一个足够精确的错误描述,无法帮助您。什么不起作用?它怎么不起作用?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们以什么方式不同?您能否提供您希望发生的行为的精确说明,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常、拐角情况、特殊情况、边界情况和边缘情况下,您预期会发生什么?请同时提供一个.Hi,为什么要检查数组下的swapped=false
。当swapped=false
位于数组之后时,每个都不能向数组发出信号表明它已排序(并结束循环)。每个都可以发出信号结束循环?我的理解是,这两种方法最终都会设置sorted=true
,从而结束循环。swapped==false
(在array.each中以及在`array.each之后)的代码顺序如何在这里起作用?希望我说的有道理。如果在整个块运行后,没有执行交换,那么数组将被排序。在每个
循环中,交换
为假
,直到找到顺序错误的第一对值。如果要对[1,2,7,4]
进行排序,则每个的第一次迭代将1
与2
进行比较,它们的顺序正确,交换的未设置为true
。如果在每个块中检查其值,则在比较1
和2
之后,sorted
被设置为true
,即得出错误的结论,即列表是在没有检查其所有项的情况下排序的。然而,对于[1,2,7,4]
,在“排序”之后,我感到困惑使用错误的代码,它会以某种方式返回[1,2,4,7],这是所需的顺序。对于[1,2,7,4]
您的代码只运行一次,直到循环。当它将1
与2
进行比较时,它错误地将sorted
设置为true
<代码>2和7的顺序也正确<代码>7
和4
被交换,然后退出,直到循环。数组现在已排序,但正确的算法需要对循环进行额外的迭代,直到循环检测到为止。在每次迭代中打印数组
,排序
,交换
,i
等的值(包括直到
和每个
),并查看其工作原理。或者使用调试器一步一步地运行程序并检查变量的内容。请容忍我,为什么代码只运行一次直到循环?我还没有学会如何使用调试器,但我会记住这一点。
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
# 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]