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

矩阵主对角线升序排序代码无效果,求排查错误原因

矩阵主对角线排序代码无效的问题排查

问题描述

需求:将矩阵主对角线元素按从小到大排序。

实现代码如下(执行后矩阵无任何变化):

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:35:19