0

我需要按升序(所有元素)对给定矩阵进行排序。

让我们假设给定矩阵是

2  0  4  -1
-3 1  5   5
6  4  4   9
-5 8  10  12

排序后的矩阵应该是这样的:

-5  -3  -1  0 
1   2   4   4
4   5   5   6
8   9   10  12

我的代码给了我不好的结果。

当k = 0 w = 0它没问题时它很好
,它countinues k = 0 w = 1但是然后它跳到
k = 1 w = 1而不检查k = 1 w = 0因为w = j我需要用替换w有什么可以解决的,但我不知道用什么来代替它

我的代码:

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

#define n 2

int main()
{
    int arr[n][n],min,i,j,tmp,y,k,w,z=0,q=0;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            printf("Enter number: ");
            scanf("%d",&arr[i][j]);
        }

    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            min=arr[i][j];
            for(k=i;k<n;k++)
            {
                for(w=j;w<n;w++)
                if(arr[k][w]<min)
                {
                    min=arr[k][w];
                    z=k;
                    q=w;
                }
                w=0;
            }
            tmp=arr[i][j];
            arr[i][j]=min;
            arr[z][q]=tmp;
        }

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            printf("%d ",arr[i][j]);
        printf("\n");
    }
}
4

2 回答 2

2

问题在于w=j。您在循环结束时设置w为,但在开始新循环时立即将其设置回。0j

另一个问题是 ifarr[i][j]是最小的元素,z并且q本质上是垃圾值,因为它们从未设置过,它们仍然是之前迭代中的值。您需要像min在循环开始时设置的那样设置这些。

作为一个小问题,您还应该return 0;main.

更新代码:

// initialize z and q
z = i;
q = j;

min = arr[i][j];

// set w here
w = j;

for (k = i; k < n; k++)
{
    // don't set w here
    for (; w < n; w++)
    if (arr[k][w] < min)
    {
        min = arr[k][w];
        z = k;
        q = w;
    }
    w = 0;
}

测试

于 2013-05-26T18:31:27.613 回答
1

还有一个额外的问题(杜克林的方法正好解决了另一个问题)。

在每个循环的结尾,您将值分配给arr[i][j]to arr[z][q]。如果您没有找到较小的元素,z并且q仍然保留上一个循环中的值并且您进行交换(或分配)。您需要检查是否找到了小于实际 ( arr[i][j]) 元素的元素。

不是最好的解决方案:

if ( arr[z][q] < arr[i][j] )
{
    tmp=arr[i][j];
    arr[i][j]=min;
    arr[z][q]=tmp;
}
于 2013-05-26T19:01:19.487 回答