C语言 冒泡排序二维数组不正确

zlhcx6iw  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(141)

我尝试对矩阵的侧对角线进行递减冒泡排序,但是显示的元素错误。问题出在索引上,但是我不知道如何解决

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <math.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

希望得到您的帮助!
我设法尝试在这个视频中给出的方法:https://www.youtube.com/watch?v=YqzNgaFQEh8,但未成功

zujrkrfu

zujrkrfu1#

代码至少存在以下问题:

不是交换

错误编码的交换

int temp = a[n - j - 1][j];
            a[n - j - 1][j] = a[n-j][j+1];
            // a[n-j-2][j+1] = temp;
            a[n-j][j+1] = temp;

输出格式

如果目标是查看精确到小数点后2位的值(在7列中),则使用"%7.2g""%7.2f",而不是"%6.0f"
我建议在循环之后打印'\n',而不是在循环之前打印。

// printf ("\n");  // Delete
    for ( j = 0; j < m; j++)
    {
        printf ("%6.0f", a[i][j]);
    }
    // Add
    printf ("\n");

相关问题