C语言用指针算术查找二维数组列最大值并替换的优化咨询
优化实现方案
优化说明
原有方案需要重复编写5次逻辑,且每次遍历全量25个元素筛选目标列,效率较低。优化后外层套列循环即可覆盖所有列,同时按内存偏移直接访问目标列元素,无需遍历全矩阵:
- 按C语言二维数组内存连续存储的特性,第
row行第col列的元素偏移量为row * 5 + col,直接通过指针算术访问即可 - 每处理一列前重置最大值临时变量,避免未初始化或上一列结果的干扰
- 支持两种实现版本,可按需求选择
全量最大值替换版本(一列有多个相同最大值时全部替换)
#include <float.h> // 原有矩阵初始化逻辑保持不变 double array2d[5][5]; double *ptr = array2d[0]; // 初始化矩阵 for (int i = 0; i < 5; ++i) { for (int j = 0; j < 5; ++j) { if (j % 2 != 0) { array2d[i][j] = (i + 1) - 2.5; } else { array2d[i][j] = 2 * (i + 1) + 0.5; } } } // 优化后的处理逻辑 for (int col = 0; col < 5; col++) { double maxTemp = DBL_MIN; // 查找当前列最大值 for (int row = 0; row < 5; row++) { double current = *(ptr + col + row * 5); if (current > maxTemp) { maxTemp = current; } } // 替换当前列所有最大值为-1 for (int row = 0; row < 5; row++) { double *current_p = ptr + col + row * 5; if (*current_p == maxTemp) { *current_p = -1; } } }
单最大值替换版本(仅替换第一个/唯一一个最大值,性能更高)
如果每列仅存在一个最大值,无需二次遍历,查找最大值时直接记录指针位置即可:
#include <float.h> // 矩阵初始化逻辑同上 for (int col = 0; col < 5; col++) { double maxTemp = DBL_MIN; double *max_p = NULL; for (int row = 0; row < 5; row++) { double *current_p = ptr + col + row * 5; if (*current_p > maxTemp) { maxTemp = *current_p; max_p = current_p; } } if (max_p != NULL) { *max_p = -1; } }
内容的提问来源于stack exchange,提问作者Ruby Rain
相关产品推荐
相关产品推荐

