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

二维矩阵副对角线冒泡排序结果错误,寻求索引问题解决方法

二维矩阵副对角线降序冒泡排序错误排查与修复

我尝试对二维矩阵的副对角线元素进行降序冒泡排序,但输出结果错误,推测问题出在索引处理上,不知道怎么解决。以下是我的C语言实现代码,附期望的排序后输出示例,参考过视频教程但没解决。

原错误代码

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>

int main () {
    double a[100][100];
    int n, m;
    int i, j, b, c;
    srand (time (NULL));
    scanf ("%d", &n);
    scanf ("%d", &m);
    for (  i = 0; i < n; i++)
    {
        for (  j = 0; j < m; j++)
        {
            a[i][j] = 0.09 * (rand () %1000) - 0.5;
        }
    }
    printf ("Array A[N][M]: \n");
    for ( i = 0; i < n; i++)
    {
        printf ("\n");
        for ( j = 0; j < m; j++)
        {
            printf ("%6.0f", a[i][j]);
        }
    }
    printf ("\n");
    printf ("\nElements of the right diagonal are: \n");
    for (j = 0; j < m; j++)
    {
        printf( "%6.0lf", a[n - j - 1][j]);
    }
    printf ("\n");
    printf ("\n Sorted array A[N][M]:");
    for ( i = 0; i < n; i++)
    {
        for ( j = 0; j < (m-1); j++)
        {
            if (a[n - j - 1][j]<a[n-j][j+1])
            {
                int temp = a[n - j - 1][j];
                a[n - j - 1][j] = a[n-j][j+1];
                a[n-j-2][j+1] = temp;
            }
        }
    }
    printf ("\n");
    for ( i = 0; i < n; i++)
    {
        printf ("\n");
        for ( j = 0; j < m; j++)
        {
            printf ("%6.0f", a[i][j]);
        }
    }
    printf ("\nElements of the right diagonal are: \n");
    for (j = 0; j < m; j++)
    {
        printf( "%6.0lf", a[n - j-2][j+1]);
    }
    return 0;
}

期望输出示例

0.74   4.35   7.05     9.1   6.46     6.6   7.48
   5.41   7.28   4.85     2.8   4.28   7.47   7.87
   5.83   2.73   9.42   7.14   1.38   7.22   1.21
   6.91     3.8   9.51   4.56   8.74   7.43   5.63
   9.65   8.04   1.02   9.71   6.02   5.61   1.15
   2.35   1.04   2.23   4.43   6.45     4.5   4.31
     2.7   5.79   3.33   8.44   6.99   4.79        1
Diagonal :    7.48   7.47   1.38   4.56   1.02   1.04    2.7
Sorted array:
   0.74   4.35   7.05     9.1   6.46     6.6   7.48
   5.41   7.28   4.85     2.8   4.28   7.47   7.87
   5.83   2.73   9.42   7.14   4.56   7.22   1.21
   6.91     3.8   9.51     2.7   8.74   7.43   5.63
   9.65   8.04   1.38   9.71   6.02   5.61   1.15
   2.35   1.04   2.23   4.43   6.45     4.5   4.31
   1.02   5.79   3.33   8.44   6.99   4.79        1
Diagonal :   7.48   7.47   4.56    2.7   1.38   1.04   1.02

问题分析与修复

核心错误点

  1. 索引逻辑混乱:排序时交换的目标位置a[n-j-2][j+1]不属于副对角线,输出排序后副对角线的索引也错误,副对角线元素的正确索引始终是a[n-j-1][j](当n=m时)。
  2. 数据类型不匹配:用int temp存储double类型元素,导致精度丢失,需改为double temp。
  3. 冒泡排序逻辑错误:外层循环不应遍历矩阵行数,而应遍历副对角线的元素个数;内层循环需针对未排序的副对角线元素进行比较交换。

修复后的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main () {
    double a[100][100];
    int n, m;
    int i, j;
    srand(time(NULL));
    scanf("%d", &n);
    scanf("%d", &m);

    // 初始化矩阵
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            a[i][j] = 0.09 * (rand() % 1000) - 0.5;
        }
    }

    // 输出原矩阵
    printf("Array A[N][M]: \n");
    for (i = 0; i < n; i++) {
        printf("\n");
        for (j = 0; j < m; j++) {
            printf("%6.0f", a[i][j]);
        }
    }
    printf("\n");

    // 输出原副对角线
    printf("\nElements of the right diagonal are: \n");
    int diag_len = (n < m) ? n : m; // 副对角线元素个数为行列数的较小值
    for (j = 0; j < diag_len; j++) {
        printf("%6.0lf", a[n - j - 1][j]);
    }
    printf("\n");

    // 副对角线降序冒泡排序
    printf("\nSorted array A[N][M]:\n");
    for (i = 0; i < diag_len - 1; i++) {
        for (j = 0; j < diag_len - 1 - i; j++) {
            // 当前副对角线元素:a[n-j-1][j],下一个元素:a[n-(j+1)-1][j+1] = a[n-j-2][j+1]
            if (a[n - j - 1][j] < a[n - j - 2][j + 1]) {
                double temp = a[n - j - 1][j];
                a[n - j - 1][j] = a[n - j - 2][j + 1];
                a[n - j - 2][j + 1] = temp;
            }
        }
    }

    // 输出排序后的矩阵
    for (i = 0; i < n; i++) {
        printf("\n");
        for (j = 0; j < m; j++) {
            printf("%6.0f", a[i][j]);
        }
    }
    printf("\n");

    // 输出排序后的副对角线
    printf("\nElements of the right diagonal are: \n");
    for (j = 0; j < diag_len; j++) {
        printf("%6.0lf", a[n - j - 1][j]);
    }
    printf("\n");

    return 0;
}

关键修改说明

  • 新增diag_len变量,处理行列数不等的情况,副对角线元素个数取min(n,m)。
  • 修正冒泡排序的循环逻辑,外层循环次数为diag_len-1,内层循环针对未排序的副对角线元素。
  • 修正交换时的索引,确保仅在副对角线的相邻元素间交换。
  • 将temp改为double类型,避免精度丢失。
  • 修正排序后副对角线的输出索引,回归正确的a[n-j-1][j]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:50:33