我需要按升序(所有元素)对给定矩阵进行排序。
让我们假设给定矩阵是
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");
}
}
答案 0 :(得分:2)
问题在于w=j
。您在循环结束时将w
设置为0
,但随后在开始新循环时立即将其设置回j
。
另一个问题是,如果arr[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;
}
答案 1 :(得分:1)
还有一个问题(Dukeling的方法在另一个问题上是正确的)。
在每个循环结束时,您将arr[i][j]
的值分配给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;
}