矩阵多列排序结果不符预期,求排查Python实现错误原因
问题分析与解决
你的排序逻辑核心问题在于逐列单独做冒泡排序会破坏之前列的排序结果,完全不符合多列依次排序的要求。
为什么你的代码会出错?
多列依次排序的本质是:当前面的列值相等时,才用后面的列来决定顺序。但你的代码是对每一列单独做一次全局冒泡排序——比如你先按第3列排好顺序,接着按第1列排序时,只会比较每行第1列的值,完全不管第3列的结果,直接把之前的排序结果打乱了。
举个例子,你第一次按第3列(索引2)排序后,矩阵应该是:
[2,7,7,1,2], [2,1,7,1,9], [3,1,8,1,9], [3,7,8,2,9]
但接着按第1列(索引0)排序时,代码会把第1列值为2的行放前面,但比较时只看第1列,所以[2,1,7,1,9]会被放到[2,7,7,1,2]前面,直接破坏了第3列的排序结果,这就是你得到错误输出的原因。
正确的实现方式
多列排序应该基于复合排序键,把每一行的排序依据设置为sort_columns指定的列值组成的元组,然后一次性完成排序,而不是逐列单独排序。
用Python内置函数实现(简洁高效)
def sort_matrix_columns(matrix, sort_columns): # 把1开始的列号转成0开始的索引 key_indices = [col - 1 for col in sort_columns] # 按复合键排序:依次比较sort_columns指定的每一列 return sorted(matrix, key=lambda row: tuple(row[idx] for idx in key_indices))
手动实现排序(理解底层逻辑)
如果一定要手动实现排序逻辑,需要在比较时同时考虑所有排序列的优先级,而不是只看当前列:
def sort_matrix_columns(matrix, n, sort_columns): key_indices = [col - 1 for col in sort_columns] for i in range(n): for j in range(i + 1, n): # 按排序列的优先级依次比较,找到第一个不同的列判断顺序 for idx in key_indices: if matrix[i][idx] > matrix[j][idx]: matrix[i], matrix[j] = matrix[j], matrix[i] break elif matrix[i][idx] < matrix[j][idx]: break
验证结果
用正确代码运行你的输入后,得到的结果和预期完全一致:
2 7 7 1 2 3 1 8 1 9 2 1 7 1 9 3 7 8 2 9
内容的提问来源于stack exchange,提问作者Tivasic
相关产品推荐
相关产品推荐

