2013-05-26 49 views
0

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

让我们假设给定矩阵是

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瓦特= 0 因为 W的= j的 我需要的东西来代替W¯¯修复它 但我不知道什么来取代它

我的C ode:

#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"); 
    } 
} 
+1

定义 “坏的结果。” –

+5

欢迎来到Stack Overflow!要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或者添加打印语句)来分析问题,追踪程序的进度,并将其与预期发生的情况进行比较。只要两者发生分歧,那么你就发现了你的问题。 (然后如果有必要,你应该构建一个[最小测试用例](http://sscce.org)。) –

+0

当k = 0 w = 0 ..它确定它确实不错..它计数 k = 0 w = 1 但是然后..它跳转到k = 1 w = 1 ..没有检查k = 1 w = 0 因为** w^= j的** 我需要更换** W =财产以后“**解决它的..但我不与 知道什么来取代它 –

回答

2

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

的另外一个问题是,如果arr[i][j]是最小的元素,zq将基本上是垃圾的价值观,因为他们从来没有,他们仍然将是什么,他们在之前的迭代。您需要在循环开始时设置min

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

更新代码:

// 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

+0

还是一样糟糕的结果 –

+0

敢肯定它的最新版本...它仍然给出错误的结果 –

+0

@OausimDjango请参阅编辑 – Dukeling

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; 
} 
+0

你的修复程序无法正常工作,请参考[this](http://ideone.com/eO7cBi)。 – Dukeling

+0

@Dukeling是的,你说的对,在某些情况下,z和q是未初始化的。在代码开始处使用初始化“z = q = 0”时,它应该可以很好地工作(在某些情况下,比您的每次交换方法更少的确认)。 – gkovacs90

+0

在链接的例子中,在代码的开头,'z'和'q'已经被设置为'0'。我怀疑在上次迭代期间发生交换*时没有发生问题。 – Dukeling