二维数组我直接赋的初值。数组的行数和列数你改常量就行了。
你想手动输入数组值,你自己写一个输入就行了。
代码功能:先对每行进行一次升序排列,再对每列进行一次升序排列。无限循环直到数组不再发生变动。
也就是说,至少会有两轮行列排序检测。
#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;
}