You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二维数组按列排序问题:冒泡排序实现后最后一列未排序求帮助

问题分析与解决

你的代码存在两个关键问题,导致最后一列未被排序:

  1. 列遍历范围错误:num = new_array.length 是原数组的列数(5),而 (num-1).times do |i| 只会遍历索引0到3的列,完全漏掉了索引4的最后一列——这是最后一列未排序的直接原因。
  2. 冒泡排序逻辑混淆:你把「遍历所有列」和「冒泡排序的轮次」嵌套在一起,导致排序逻辑混乱,即使修复了遍历范围,排序结果也可能不正确。

修正后的代码

正确的做法是对转置后的每个子数组(即原数组的每一列)单独执行冒泡排序:

def bubble_sort(array)
  transposed = array.transpose
  # 遍历每一列(转置后的每个子数组)
  transposed.each do |column|
    loop do
      sorted = false
      # 对当前列执行冒泡排序,比较次数为列长度-1
      (column.length - 1).times do |j|
        if column[j] > column[j+1]
          column[j], column[j+1] = column[j+1], column[j]
          sorted = true
        end
      end
      break unless sorted
    end
  end
  transposed.transpose
end

优化版(减少不必要的比较)

冒泡排序每一轮都会将当前最大的元素移到末尾,因此可以每轮减少一次比较次数,提升效率:

def bubble_sort(array)
  transposed = array.transpose
  transposed.each do |column|
    n = column.length
    loop do
      swapped = false
      (n - 1).times do |j|
        if column[j] > column[j+1]
          column[j], column[j+1] = column[j+1], column[j]
          swapped = true
        end
      end
      n -= 1 # 每轮后末尾元素已排序,减少比较次数
      break unless swapped
    end
  end
  transposed.transpose
end

测试结果

将原数组传入修正后的方法,输出结果如下(每一列均为升序排列):

2   5   1   5   2
10  9   6   7   3
15  10  24  12  7
17  17  56  42  11
23  32  98  48  31

内容的提问来源于stack exchange,提问作者valga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:10:28