1.题目要求:
将一个5X5的矩阵中最大的元素放在中心·,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。
2.数组法实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//一、数组法实现
int main()
{
int arr[5][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}
};
void sort(int (*arr)[5],int row,int col);
sort(arr,5,5);
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
printf("%5d", arr[i][j]);
}
printf("\n");
}
return 0;
}
void sort(int arr[][5],int row,int col)
{
//1.找到最大值放到中间
int* mid = &arr[row / 2][col / 2];
int* max = mid;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (*max < arr[i][j])
{
max = &arr[i][j];
}
}
}
int temp = *max; *max = *mid; *mid = temp;
//2.分别找到四个最小值,放到四个角
int* corner[4] = { &arr[0][0],&arr[0][col - 1],&arr[row - 1][0],&arr[row - 1][col - 1] };
for (int i = 0; i < 4; i++)
{
int* min = mid;//这时候mid位置就是最大值位置
for (int m = 0; m < row; m++)
{
for (int n = 0; n < col; n++)
{
int k = 0;
for (k = 0; k < i; k++)//找到第0个最小数的时候,i是0,意味着没有角落被置换,找到第1个最小值,i是1
{
if (&arr[m][n] == corner[k]) {
//这就是被置换完毕的角落的位置
break;
}
}
if (k != i)continue;//k不等于i就意味着上面的for循环break出来了,此时该位置就是被置换的角落,应该避免该位置
if (*min > arr[m][n])//第m行n列的数据,比min位置的数据小,则让min指向新位置
{
min = &arr[m][n];
}
}
}
int temp = *min; *min = *corner[i]; *corner[i] = temp;
}
}
3.指针法实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//二、指针法实现
int main()
{
int arr[5][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}
};
void sort(int (*arr)[5],int row,int col);
sort(arr,5,5);
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
printf("%5d", arr[i][j]);
}
printf("\n");
}
return 0;
}
二、指针法实现
void sort(int (*arr)[5], int row, int col)
{
//1.找到最大值放到中间
int* mid = *(arr + row / 2) + col / 2;
int* max = mid;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (*max < *(*(arr+i)+j))
{
max = *(arr+i)+j;
}
}
}
int temp = *max; *max = *mid; *mid = temp;
//2.分别找到四个最小值,放到四个角
int* corner[4] = { *arr,*arr + col - 1,*(arr + row - 1),*(arr + row - 1) + col - 1 };
for (int i = 0; i < 4; i++)
{
int* min = mid;//这时候mid位置就是最大值位置
for (int m = 0; m < row; m++)
{
for (int n = 0; n < col; n++)
{
int k = 0;
for (k = 0; k < i; k++)//找到第0个最小数的时候,i是0,意味着没有角落被置换,找到第1个最小值,i是1
{
if (*(arr+m)+n == corner[k]) {
//这就是被置换完毕的角落的位置
break;
}
}
if (k != i)continue;//k不等于i就意味着上面的for循环break出来了,此时该位置就是被置换的角落,应该避免该位置
if (*min > *(*(arr+m)+n))//第m行n列的数据,比min位置的数据小,则让min指向新位置
{
min = *(arr+m)+n;
}
}
}
int temp = *min; *min = *corner[i]; *corner[i] = temp;
}
}