二维数组按列排序问题:冒泡排序实现后最后一列未排序求帮助
问题分析与解决
你的代码存在两个关键问题,导致最后一列未被排序:
- 列遍历范围错误:
num = new_array.length是原数组的列数(5),而(num-1).times do |i|只会遍历索引0到3的列,完全漏掉了索引4的最后一列——这是最后一列未排序的直接原因。 - 冒泡排序逻辑混淆:你把「遍历所有列」和「冒泡排序的轮次」嵌套在一起,导致排序逻辑混乱,即使修复了遍历范围,排序结果也可能不正确。
修正后的代码
正确的做法是对转置后的每个子数组(即原数组的每一列)单独执行冒泡排序:
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
相关产品推荐
相关产品推荐

