为了账号安全,请及时绑定邮箱和手机立即绑定

尝试做了下 结果还是不对阿,请问该怎么修改?

尝试做了下 结果还是不对阿,请问该怎么修改?

C
绝地无双 2022-11-19 18:14:15

从键盘输入5行4列的二维整型数组 a 的各元,然后将数组a各列元素分别按升序排序,再按行输出数组a的各元.

#include <stdio.h>
#define M 5
#define N 4
main()
{
int a[M][N],i,j,k,t=0;
for(i=0; i<M; i++)
for(j=0; j<N; j++)
scanf("%d", &a[i][j]);
for(j=0;j<N;j++)
{for(i=0;i<M;i++)
{for(k=0;k<M;k++)
if(a[k][j]>a[k+1][j])
{ t=a[k][j];
a[k][j]=a[k+1][j];
a[k+1][j]=t;}
}
}

for(i=0;i<M;i++)
{printf("\n");
for(j=0;j<N;j++)
printf("%d ",a[i][j]) ;

}
}

查看完整描述

2 回答

?
慕标琳琳

TA贡献1510条经验 获得超9个赞

在C语言中,二维数组按行存储,对每一行排序很方便,可以把每一行当成一个一维数组,使用排序函数直接进行排序。

然而对每一列进行排序,就不能直接当成一维数组进行排序。但是仍然可以把第j列a[0...M-1][j]在逻辑上当成一维数组进行排序,下面以使用冒泡排序为例对其排序。

对二维数组按列排序后,进一步展示了如何调用快速排序函数按行进行排序。

程序源码:


#include <stdio.h>#include <stdlib.h>  #define M 3#define N 3 //输出二维数组的函数void print(int a[][N]){   int i,j;   for(i=0;i<M;i++)   {      for(j=0;j<N;j++)      {         printf("%d ",a[i][j]);      }      printf("\n");   } //qsort的cmp函数int cmp(const void*a, const void *b){     return *(int*)a-*(int*)b;} int main(int argc, char* argv){     int a[M][N]={3,2,1,9,8,7,6,5,4};         printf("按列排序前的二维数组是:\n");    print(a);    printf("\n");    int j;    for(j=0;j<N;j++)//对每一列进行升序排序     {       //对第j列进行排序        int m,n;       int t;       for(m=M-1;m>0;m--)       {            for(n=0;n<m;n++)            {                  if(a[n][j]>a[n+1][j])                  {                      t=a[n][j];                      a[n][j]=a[n+1][j];                      a[n+1][j]=t;                  }                           printf("按列排序后二维数组变为:\n");    print(a);    printf("\n");          //对按列排序后的二维数组按行升序排序 (调用快速排序函数)          int i;    for(i=0;i<M;i++)    {        qsort(a[i],N,sizeof(a[i][0]),cmp);             printf("按列排序后再按行排序后二维数组变为:\n");    print(a);    printf("\n");    system("pause");    return 0;}

编译运行后的结果如下:


 


查看完整回答
反对 回复 2022-11-22
?
Cats萌萌

TA贡献1539条经验 获得超9个赞

冒泡法。。
#include <stdio.h> 
#define M 5 
#define N 4 
void main() 

int a[M][N],i,j,k,t=0; 
for(i=0; i<M; i++) 
for(j=0; j<N; j++) 
scanf("%d", &a[i][j]); 
for(j=0;j<N;j++) 
{
for(i=0;i<M;i++)
{
for(k=M-1;k>i;k--)
if(a[k][j]<a[i][j]) 

t=a[k][j]; 
a[k][j]=a[i][j]; 
a[i][j]=t;




for(i=0;i<M;i++) 
{
printf("\n"); 
for(j=0;j<N;j++) 
printf("%d ",a[i][j]) ; 


}
你的K+1会超过M的。


查看完整回答
反对 回复 2022-11-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信