Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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]