对数组中的奇数进行排序,同时将偶数保留在适当的位置

时间:2018-12-03 22:04:57

标签: arrays ruby

我正在进行编码挑战,以对数组的奇数元素进行排序,同时将所有偶数元素保持在其初始位置。

我可以在偶数元素之间对奇数元素进行分组排序,而无需考虑偶数,但是我希望在整个数组中对它们进行排序。这是我的代码:

def sort_array source_array
  return [] if source_array.empty?
  a = source_array
  n = a.length
  loop do
    swapped = false
    (n - 1).times do |i|
      if (a[i] > a[i + 1]) && a[i].odd? && a[i + 1].odd?
        a[i], a[i + 1] = a[i + 1], a[i]
        swapped = true
      end
    end
    break if not swapped
  end
  a
end

source_array = [7, 5, 35, 8, 12, 17, 47, 47, 37, 64, 22, 55, 13]
p sort_array(source_array)
# => [5, 7, 35, 8, 12, 17, 37, 47, 47, 64, 22, 13, 55]

3 个答案:

答案 0 :(得分:2)

您可以尝试这种方法:

  • 创建一个具有所有优势的数组(保持source_array不变)。分类 这个数组。
  • 逐元素考虑source_array。是个 即使离开它。如果很奇怪,请用 排序赔率列表中的第一个元素。删除第一个元素 排序列表。

答案 1 :(得分:0)

source_array = [7, 5, 35, 8, 12, 17, 47, 47, 37, 64, 22, 55, 13]
odd_sorted = source_array.select(&:odd?).sort

source_array.map {|input| input.even? ? input : odd_sorted.shift }

# [5, 7, 13, 8, 12, 17, 35, 37, 47, 64, 22, 47, 55]

答案 2 :(得分:0)

有两种方法可以做到这一点。

arr = [7, 5, 35, 8, 12, 17, 47, 47, 37, 64, 22, 55, 13]

两者都从以下计算开始

odd, even = arr.each_with_index.partition { |n,i| n.odd? }
  #=> [[[7, 0], [5, 1], [35, 2], [17, 5], [47, 6], [47, 7], [37, 8], [55, 11], [13, 12]],
  #    [[8, 3], [12, 4], [64, 9], [22, 10]]]
odd
  #=> [[7, 0], [5, 1], [35, 2], [17, 5], [47, 6], [47, 7], [37, 8], [55, 11], [13, 12]]
even
  #=> [[8, 3], [12, 4], [64, 9], [22, 10]]

请参见Enumerable#each_with_indexEnumerable#partitionInteger#odd?

#1

   odd_val, odd_idx = odd.transpose
     #=> [[7, 5, 35, 17, 47, 47, 37, 55, 13],
     #    [0, 1,  2,  5,  6,  7,  8, 11, 12]]
   a = even.concat(odd_val.sort.zip(odd_idx))
     #=> [[8, 3], [12, 4], [64, 9], [22, 10], [5, 0], [7, 1], [13, 2],
     #    [17, 5], [35, 6], [37, 7], [47, 8], [47, 11], [55, 12]]
   h = a.map(&:reverse).to_h
     #=> {3=>8, 4=>12, 9=>64, 10=>22, 0=>5, 1=>7, 2=>13, 5=>17, 6=>35, 7=>37,
     #    8=>47, 11=>47, 12=>55}
   h.values_at(*0..arr.size-1)
     #=> [5, 7, 13, 8, 12, 17, 35, 37, 47, 64, 22, 47, 55]

注意:

odd_val.sort.zip(odd_idx)
  #=> [5, 7, 13, 17, 35, 37, 47, 47, 55].zip([0, 1,  2,  5,  6,  7,  8, 11, 12])
  #=> [[5, 0], [7, 1], [13, 2], [17, 5], [35, 6], [37, 7], [47, 8], [47, 11], [55, 12]]

请参见Array#sortArray#zipHash#values_at

#2

a = odd.map(&:first).sort
  #=> [5, 7, 13, 17, 35, 37, 47, 47, 55]
even.each { |n,i| a.insert(i,n) }
a #=> [5, 7, 13, 8, 12, 17, 35, 37, 47, 64, 22, 47, 55]

请参见Array#insert