#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]交换位置。