按c中的升序对矩阵的所有元素进行排序

时间:2013-05-26 18:17:52

标签: c sorting matrix

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

让我们假设给定矩阵是

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 它没问题确实很好 它数了     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");
    }
}

2 个答案:

答案 0 :(得分:2)

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

另一个问题是,如果arr[i][j]是最小元素,zq基本上都是垃圾值,因为它们从未设置过,它们仍然是它们所在的上一次迭代。您需要在循环开始时设置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;
}

Test

答案 1 :(得分:1)

还有一个问题(Dukeling的方法在另一个问题上是正确的)。

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

不是最好的解决方案:

if ( arr[z][q] < arr[i][j] )
{
    tmp=arr[i][j];
    arr[i][j]=min;
    arr[z][q]=tmp;
}