C语言-使用数组法,指针法实现将一个5X5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。

1.题目要求:

将一个5X5的矩阵中最大的元素放在中心·,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。

2.数组法实现

c 复制代码
#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.指针法实现

c 复制代码
#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;
	}
}
相关推荐
码破苍穹ovo2 小时前
堆----1.数组中的第K个最大元素
java·数据结构·算法·排序算法
愤怒的小鸟~~~2 小时前
c语言创建的一个队列结构(含有这个头指针和这个尾指针的结构具有一定的参考价值)
c语言·开发语言·算法
Joker-01113 小时前
深入 Go 底层原理(十二):map 的实现与哈希冲突
算法·go·哈希算法·map
金融小师妹4 小时前
AI量化模型解析黄金3300关口博弈:市场聚焦“非农数据”的GRU-RNN混合架构推演
大数据·人工智能·算法
金融小师妹4 小时前
基于LSTM-GRU混合网络的动态解析:美联储维稳政策与黄金单日跌1.5%的非线性关联
大数据·人工智能·算法
白日梦想家-K5 小时前
题单【模拟与高精度】
开发语言·c++·算法
重生之我是Java开发战士5 小时前
【C语言】内存函数与数据在内存中的存储
c语言·开发语言·算法
Hello_Embed6 小时前
嵌入式 C 语言入门:循环结构学习笔记 —— 从语法到实用技巧
c语言·笔记·stm32·学习
roman_日积跬步-终至千里6 小时前
【机器学习】“回归“算法模型的三个评估指标:MAE(衡量预测准确性)、MSE(放大大误差)、R²(说明模型解释能力)
算法·机器学习·回归
南棱笑笑生7 小时前
20250802让飞凌OK3576-C开发板在飞凌的Android14下【rk3576_u选项】适配NXP的WIFIBT模块88W8987A的蓝牙
c语言·开发语言