c语言给定二维整型数组先对每行从小到大排序,后对每列从小到大排序反复执行,每行不低于3列不低于4

如题所述

二维数组我直接赋的初值。数组的行数和列数你改常量就行了。

你想手动输入数组值,你自己写一个输入就行了。

代码功能:先对每行进行一次升序排列,再对每列进行一次升序排列。无限循环直到数组不再发生变动。

也就是说,至少会有两轮行列排序检测。

#include<stdio.h>
#include<malloc.h>
#define row 3
#define clo 4
int px(int **ns,int len);//对数组升序排列
void printfNUMS(int *nums,int r,int c);//打印数组
int main()
{
    int i,j,flag=0,cnt=0,nums[row][clo]={{4,6,2,8},{4,8,3,2},{9,8,6,4}},**ns=NULL;

    printf("原始的数组:\n");
    printfNUMS(&nums[0][0],row,clo);

    while(1)
    {
        flag=0;
        cnt++;
        ns=(int **)malloc(sizeof(int *)*clo);
        if(!ns)
        {
            printf("内存错误!\n");
            return 1;
        }

        printf("第%d次对分别对行列进行升序排列\n",cnt);
        for(i=0;i<row;i++)//对每行进行排序
        {
            for(j=0;j<clo;j++)
                ns[j]=&nums[i][j];
            if(px(ns,clo))
                flag=1;
        }
        printf("--每行进行一次排序,数组变成:\n");
        printfNUMS(&nums[0][0],row,clo);

        free(ns);
        ns=(int **)malloc(sizeof(int *)*row);
        if(!ns)
        {
            printf("内存错误!\n");
            return 1;
        }
        for(i=0;i<clo;i++)//对每列进行排序
        {
            for(j=0;j<row;j++)
                ns[j]=&nums[j][i];
            if(px(ns,row))
                flag=1;
        }
        printf("--每列进行一次排序,数组变成:\n");
        printfNUMS(&nums[0][0],row,clo);
        printf("\n");
        if(!flag)
            break;
    }
    printf("数组行列均已实现升序排列!程序结束\n");

    return 0;
}

void printfNUMS(int *nums,int r,int c)//打印数组,传参首地址
{
    int i,j;
    for(i=0;i<r;i++)//对每行进行排序
    {
        for(j=0;j<c;j++)
            printf("%d ",*nums++);
        printf("\n");
    }
}
int px(int **ns,int len)//对数组(指针数组)升序排列,如果发送交换返回1,没有返回0
{
    int i,j,flag=0;
    for(i=0;i<len;i++)
        for(j=i+1;j<len;j++)
            if(*ns[i]>*ns[j])
                *ns[i]^=*ns[j],*ns[j]^=*ns[i],*ns[i]^=*ns[j],flag=1;
    return flag;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-12-11
main()
{int a[100][100],m,n,i,j,k,t,rd;
scanf("%d%d",&m,&n);
if(m>=3&&n>=4)
{for(i=0;i<m;i++)
for(j=0;j<n;j++)scanf("%d",&a[i][j]);
while(1)
{for(i=0;i<m;i++)
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(a[i][j]>a[i][k])
t=a[i][j],a[i][j]=a[i][k],a[i][k]=t;
for(j=0;j<n;j++)
for(i=0;i<m-1;i++)
for(k=i+1;k<m;k++)
if(a[i][j]>a[k][j])
t=a[i][j],a[i][j]=a[k][j],a[k][j]=t;
for(i=0;i<m;i++)
for(j=0;j<n-1;j++)
if(a[i][j]>a[i][j+1])continue;
break;}
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
printf("%5d",a[i][j]);
printf("\n");}}}
第2个回答  2018-12-11
  第十二回:王熙凤毒设相思局,贾天祥正照风月鉴
相似回答