【问题标题】:Building Insertion Sort. Not sure what I'm doing wrong构建插入排序。不知道我做错了什么
【发布时间】:2014-12-07 22:41:01
【问题描述】:

目标是了解插入排序如何找到一个数字并将其插入到预先排序的数组中。我应该从数组中弹出最后一个数字并将其插入到数组中正确的时间顺序位置。

代码似乎适用于第一个示例,但不适用于第二个示例。在第二个例子中,正确的答案似乎出现在第四次迭代中,即使数组中有整数。

感觉我需要breakreturn 并停止在某个地方循环,但我不确定在哪里。

def  insertionSort( ar) 
  count = ar.count
  value = ar.pop

  p ar << value if value >= ar.last

  reversed = ar.reverse

  ar.count.times do |index|
    reversed.unshift(reversed.first) if reversed.count < count

    if reversed[index + 1] > value
      reversed[index] = reversed[index+1]
    else
      reversed[index] = value
    end

    puts reversed.reverse.join(' ')
  end
end

ar = [2, 4, 6, 8, 3] 
insertionSort( ar )
#=> 2 4 6 8 8
#=> 2 4 6 6 8
#=> 2 4 4 6 8
#=> 2 3 4 6 8

negatives = [-3, -6, 7, 8, 9, 5]
insertionSort( negatives )
#=> -3 -6 7 8 9 9
#=> -3 -6 7 8 8 9
#=> -3 -6 7 7 8 9
#=> -3 -6 5 7 8 9
#=> -3 5 5 7 8 9

【问题讨论】:

  • "....它正确的时间顺序..." 我知道你的意思,但是这里的时间顺序不是正确的术语:)
  • 第一行是可疑的:#=> 2 4 6 8 8 即你有两次 8,我会从那里开始

标签: ruby arrays sorting


【解决方案1】:

我想通了。我需要休息一下,然后把 else 语句放在一起。

def  insertionSort( ar) 
  count = ar.count
  value = ar.pop

  p ar << value if value >= ar.last
  reversed = ar.reverse

  ar.count.times do |index|
    reversed.unshift(reversed.first) if reversed.count < count

    if reversed[index + 1] > value
      reversed[index] = reversed[index+1]
      puts reversed.reverse.join(' ')
    elsif reversed[index + 1] == value
      reversed.slice!(index)
      puts reversed.reverse.join(' ')
      break
    else
      reversed[index] = value
      puts reversed.reverse.join(' ')
      break
    end
  end
end

ar = [2, 4, 6, 8, 3] 
insertionSort( ar )

negatives = [-3, -6, 7, 8, 9, 5]
insertionSort( negatives )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2021-01-05
    • 2019-03-13
    相关资源
    最近更新 更多