0

以下是更新后的代码:

def insertion_sort(list)
  num = list.length
  for i in (0..(num-2))
    if list[i] > list[i+1] && i == 0
      list[i], list[i+1] = list[i+1], list[i]
      i+=1
    elsif list[i] == list[i+1]
      i+=1
    elsif list[i] > list[i+1] && i > 0
      len = (list[0..(i+1)].length)
      list2 = list[0..(i+1)]
      list = list - list2
      count = 0
      while count <= len+1
        if list2[len-1] < list2[len-2]
           list2[len-2],list2[len-1]= list2[len-1],list2[len-2] 
        elsif  list2[len-1] == list2[len-2]
          count+=1
          len-=len
        else
         count+=1
         len-=1 
        end
      end
       list = list2 + list  
    end
  end
   list
end

p insertion_sort([2,1,4,8,7,3,100,99,8])
p insertion_sort([2,1,4,8,8,7,3,100,99])
p insertion_sort([3790,780,780,1,55])

概括:

  1. 如果两个相同的整数彼此相邻,则代码有效:[2,1,4,8,8,7,3,100,99] 并且数组大小> 5。
  2. 如果两个相同的整数在随机位置:[2,1,4,8,7,3,100,99,8]。以下错误会发生 aaa.rb:4:in `>': 整数与 nil 的比较失败 (ArgumentError)

第 4 行代码为: if list[i] > list[i+1] && i == 0

解决 1. 我将 while 循环更改为“while count <= len+1”,因此当数组大小小于 5 时,代码将起作用。但当相同的整数位于随机位置时则不然。

有谁知道如何解决这个问题?提前致谢!

4

1 回答 1

2

感谢评论中的澄清。我现在看到了问题。

在这里的交换算法中

elsif list[i] > list[i+1] && i > 0
  len = (list[0..(i+1)].length)
  list2 = list[0..(i+1)]
  list = list - list2
  count = 0
  while count <= len+1
    ...

您正在尝试将数组一分为二。你得到这是数组的前半部分,然后尝试通过从 中减去得到list2后半部分。 list2list

在这里使用减法的问题是,如果您有重复项,它将删除它们并使您的列表太短。

在示例中[3790,1,780,55,23,50,1111,60,50],您应该50在第一个数组中有 a 50,在后半部分有 a 。

但是使用减法删除其中之一50

当您将两个临时列表重新添加在一起时,您现在是一个短元素(缺少的50),当您到达数组末尾并尝试访问不再存在的第 9 个元素时,您会收到一个越界错误。

而不是在这里使用减法,只需使用与制作相同的方法list2

list2 = list[0..(i+1)] # All elements in list from position 0 to i+1
list = list[(i+2)..-1] # All elements in list from position i+2 to end of list

现在listlist2只是原始列表拆分,当您将它们重新添加在一起时,它们应该是相同的长度

def insertion_sort(list)
  num = list.length
  for i in (0..(num-2))
    if list[i] > list[i+1] && i == 0
      list[i], list[i+1] = list[i+1], list[i]
      i+=1
    elsif list[i] == list[i+1]
      i+=1
    elsif list[i] > list[i+1] && i > 0
      len = (list[0..(i+1)].length)
      list2 = list[0..(i+1)]
      list = list[(i+2)..-1]
      count = 0
      while count <= len+1
        if list2[len-1] < list2[len-2]
           list2[len-2],list2[len-1]= list2[len-1],list2[len-2] 
        elsif  list2[len-1] == list2[len-2]
          count+=1
          len-=len
        else
         count+=1
         len-=1 
        end
      end
       list = list2 + list  
    end
  end
   list
end

p insertion_sort([2,1,4,8,7,3,100,99,8])
p insertion_sort([2,1,4,8,8,7,3,100,99])
p insertion_sort([3790,780,780,1,55])
于 2021-11-12T19:48:12.157 回答