#include<stdio.h>
#include<stdlib.h>
int main(){
setvbuf(stdout,NULL,_IONBF,0);
int a[5][5];
int i,j;
void process(int *a);
printf("Input the matrix:\n");
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
process(*a);
printf("Output the matrix\n");
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
printf("%-3d",a[i][j]);
if(j==4)
printf("\n");
}
return EXIT_SUCCESS;
}
void process(int *a){
int i,j,k;
int max,min;
int mins[4]={0,4,20,24};
int t;
//寻找大数,放中间
max=12;
for(i=0;i<25;i++)
if(a[i]>a[max])
max=i;
if(max!=12)
{
t=a[max];
a[max]=a[12];
a[12]=t;
}
//寻找4个小数,放四角
for(i=0;i<4;i++)
{
min=mins[i];
for(j=0;j<25;j++)
{
//保证已放好位置的小数不参与比较
for(k=0;k<i;k++)
if(j==mins[k])
break;
if(k==i)
{
if(a[j]<a[min])
min=j;
}
}
if(min!=mins[i])
{
t=a[min];
a[min]=a[mins[i]];
a[mins[i]]=t;
}
}
}
当把2维数组中的首元素地址传递到函数后,2维数组a[5][5]当作1维数组a[25]处理。
整体思路是选择法:
找到数组a[25]中最大的数,与a[12]交换位置;
先找到a[0-24]中最小的数,与a[0]交换位置,
找到a[1-24]中最小的数,与a[4]交换位置;
找到a[1-3,5-24]中最小的数,与a[20]交换位置;
找到a[1-3,5-19,21-24]中最小的数,与a[24]交换位置。