要实现数组元素大小比较(例如查找最大值或最小值),其最小时间复杂度为 O (n)(线性时间复杂度),因为必须遍历所有元素至少一次才能确定最值。以下是 C 语言实现查找数组最大值和最小值的示例代码:
#include <stdio.h>
#include <limits.h> // 用于获取INT_MIN和INT_MAX(可选)
// 函数声明:查找数组的最大值和最小值(通过指针返回)
void findMinMax(int arr[], int size, int* min, int* max) {
if (size == 0) {
printf("错误:数组为空!\n");
return;
}
// 初始化min和max为数组第一个元素
*min = arr[0];
*max = arr[0];
// 遍历数组,更新min和max
for (int i = 1; i < size; i++) {
if (arr[i] < *min) {
*min = arr[i]; // 找到更小值
}
if (arr[i] > *max) {
*max = arr[i]; // 找到更大值
}
}
}
int main() {
int arr[] = {3, 7, 1, 9, 4, 2, 8, 5};
int size = sizeof(arr) / sizeof(arr[0]); // 自动计算数组长度
int min_val, max_val;
// 调用函数查找最值
findMinMax(arr, size, &min_val, &max_val);
// 输出结果
printf("数组元素:");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n最小值:%d\n最大值:%d\n", min_val, max_val);
return 0;
}
代码说明
- 时间复杂度:代码通过 1 次遍历(循环执行 n-1 次)同时找到最大值和最小值,时间复杂度为 O (n),这是理论上的最小值(因为必须检查所有元素才能确定最值)。
- 函数设计:
findMinMax
函数通过指针直接修改主函数中的min_val
和max_val
,避免了返回多个值的复杂操作。 - 鲁棒性:代码检查了数组是否为空(
size == 0
),避免了非法内存访问。 - 数组长度计算:主函数中通过
sizeof(arr) / sizeof(arr[0])
自动计算数组长度,避免硬编码。
扩展说明
- 若只需找最大值或最小值,可简化函数(例如删除其中一个条件判断),时间复杂度仍为 O (n)。
- 对于浮点数数组(如
double
类型),只需修改函数参数类型(将int arr[]
改为double arr[]
,并调整min
和max
的类型),逻辑完全一致。
本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客