矩阵主对角线升序排序代码无效果,求排查错误原因
矩阵主对角线排序代码无效的问题排查
问题描述
需求:将矩阵主对角线元素按从小到大排序。
实现代码如下(执行后矩阵无任何变化):
def sort_main_diag(): f = int(input("行数: ")) c = int(input("列数: ")) m = [] read_matrix(m,f,c) for i in range(f): for j in range(c): if i == j: for k in range(i+1,f): if m[i][j] > m[k][j]: aux = m[i][j] m[i][j] = m[k][j] m[k][j] = aux for row in m: print(row)
主对角线示意:
注:read_matrix函数代码如下:
def read_matrix(m,f,c): for i in range(f): a = [] for j in range(c): a.append(int(input("输入数据: "))) m.append(a)
错误原因
核心错误是访问主对角线元素时的列索引错误:
主对角线元素的坐标是(i,i)(第i行第i列),但你的代码中比较交换时用了m[k][j]——此时j等于当前的i,k是大于i的行索引,m[k][j]指向的是第k行第i列的元素,根本不是主对角线的元素。所以你的交换操作完全没触及主对角线,矩阵自然没有变化。
修正后的代码
把交换逻辑中的列索引从j改为k,同时简化不必要的循环:
def sort_main_diag(): f = int(input("行数: ")) c = int(input("列数: ")) m = [] read_matrix(m,f,c) # 只遍历主对角线的有效范围(取行列数较小值) diag_length = min(f, c) for i in range(diag_length): for k in range(i+1, diag_length): if m[i][i] > m[k][k]: # 交换两个主对角线元素 aux = m[i][i] m[i][i] = m[k][k] m[k][k] = aux for row in m: print(row)
补充说明:原代码中for i in range(f)+for j in range(c)+if i==j的嵌套完全冗余,直接遍历i到min(f,c)-1即可,还能避免行列数不等时出现索引越界问题。
内容的提问来源于stack exchange,提问作者Stromtropper
相关产品推荐
相关产品推荐

