Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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,bubble\u sort\u by(arr),代码正在工作,但返回原始数组_Arrays_Ruby_Loops_Yield_Bubble Sort - Fatal编程技术网

Arrays Ruby,bubble\u sort\u by(arr),代码正在工作,但返回原始数组

Arrays Ruby,bubble\u sort\u by(arr),代码正在工作,但返回原始数组,arrays,ruby,loops,yield,bubble-sort,Arrays,Ruby,Loops,Yield,Bubble Sort,简短问题: 为什么我的方法(接受块)返回原始数组而不是修改的数组 长问题: 代码如下: def bubble_sort_by(array) array.each_with_index do |outer, outer_index| array.each_with_index do |inner, inner_index| if yield(outer, inner) > 0 if outer_index < inner_index

简短问题:
为什么我的方法(接受块)返回原始数组而不是修改的数组

长问题:
代码如下:

def bubble_sort_by(array)
  array.each_with_index do |outer, outer_index|
    array.each_with_index do |inner, inner_index|
      if yield(outer, inner) > 0
        if outer_index < inner_index
              p "outer after if: " + outer        # for debugging, indented for clarity
              p "inner after if: " + inner        # for debugging
          outer, inner = inner, outer
              p "outer after swap: " + outer      # for debugging
              p "inner after swap: " + inner      # for debugging
        end
      end
    end
  end
end

bubble_sort_by(["hi","hello","hey"]) do |left,right|
  left.length - right.length
end
我在前面用非常相似的代码编写了类似的方法
bubble\u sort
(不带块),原始数组被替换为交换的值。

我不明白为什么交换的值没有保存在这里提到的方法中,而是接收原始数组。

您只交换局部变量

2.3.3 :1223 >     end
"outer after if: hello"
"inner after if: hey"
"outer after swap: hey"
"inner after swap: hello"
 => ["hi", "hello", "hey"] 
2.3.3 :1224 > 
outer, inner = inner, outer
这不会修改
数组
,要更改数组,必须使用
[]=

array[n] = value

您只交换局部变量

outer, inner = inner, outer
这不会修改
数组
,要更改数组,必须使用
[]=

array[n] = value

您需要更改数组项的值。这是工作代码:

def bubble_sort_by(array)
  array.each_with_index do |outer, outer_index|
    array.each_with_index do |inner, inner_index|
      if yield(outer, inner) > 0
        if outer_index < inner_index
              p "outer after if: " + outer        # for debugging, indented for clarity
              p "inner after if: " + inner        # for debugging
          outer, inner = inner, outer
              p "outer after swap: " + outer      # for debugging
              p "inner after swap: " + inner      # for debugging

          # change value array item
          array[inner_index] = inner
          array[outer_index] = outer
        end
      end
    end
  end
end
def bubble_排序依据(数组)
array.each_与_索引do|外部,外部_索引|
array.each_with_index do| inner,inner_index|
如果产量(外部、内部)>0
如果外部索引<内部索引
p“外部在if:+outer”之后,用于调试,为清晰起见缩进
p“if:+internal”后面的“inner”,用于调试
外部,内部=内部,外部
p“交换后的外部:+outer#用于调试
p“交换后的内部:+内部#用于调试
#更改值数组项
数组[内部索引]=内部
数组[外部索引]=外部
结束
结束
结束
结束
结束

您需要更改数组项的值。这是工作代码:

def bubble_sort_by(array)
  array.each_with_index do |outer, outer_index|
    array.each_with_index do |inner, inner_index|
      if yield(outer, inner) > 0
        if outer_index < inner_index
              p "outer after if: " + outer        # for debugging, indented for clarity
              p "inner after if: " + inner        # for debugging
          outer, inner = inner, outer
              p "outer after swap: " + outer      # for debugging
              p "inner after swap: " + inner      # for debugging

          # change value array item
          array[inner_index] = inner
          array[outer_index] = outer
        end
      end
    end
  end
end
def bubble_排序依据(数组)
array.each_与_索引do|外部,外部_索引|
array.each_with_index do| inner,inner_index|
如果产量(外部、内部)>0
如果外部索引<内部索引
p“外部在if:+outer”之后,用于调试,为清晰起见缩进
p“if:+internal”后面的“inner”,用于调试
外部,内部=内部,外部
p“交换后的外部:+outer#用于调试
p“交换后的内部:+内部#用于调试
#更改值数组项
数组[内部索引]=内部
数组[外部索引]=外部
结束
结束
结束
结束
结束

这个答案也解决了我的下一个问题,即不排序数组,其中最大的元素位于第一位(或最短的元素位于最后一位)。仅将以下内容替换为:
outer,internal=internal,outer
array[outer\u index],array[internal\u index]=array[internal\u index],array[outer\u index]
不会在“最坏情况”下对数组进行排序。我需要更深入地分析时不时发生的事情。谢谢。这个答案也解决了我的下一个问题,即不排序数组,其中最大的元素位于第一位(或最短的元素位于最后一位)。仅将以下内容替换为:
outer,internal=internal,outer
array[outer\u index],array[internal\u index]=array[internal\u index],array[outer\u index]
不会在“最坏情况”下对数组进行排序。我需要更深入地分析时不时发生的事情。谢谢