📅  最后修改于: 2023-12-03 14:59:38.558000             🧑  作者: Mango
在C语言中,数组是一种非常常见的数据类型。但是,在数组中,我们有时需要通过索引访问数组中特定的值。这就涉及到一个问题:如何查询一个数组中的最大值和最小值?
最常见的解决方法是创建两个变量max和min,将它们初始化为数组的第一个元素,然后遍历数组比较每个元素和存储最大和最小值的变量。以下是该方法的示例代码片段:
int arr[] = {34, 78, 12, 98, 65};
int size = sizeof(arr)/sizeof(arr[0]);
int i, max, min;
max = min = arr[0];
for (i = 1; i < size; i++) {
if (arr[i] > max)
max = arr[i];
if (arr[i] < min)
min = arr[i];
}
printf("最大值是:%d\n", max);
printf("最小值是:%d\n", min);
这种方法在数组较小的情况下可以有效地工作,但是在处理大型数组时可能效率较低。
分治法是另一种解决该问题的方法。该算法将数组递归地分成两半,分别查找每个子数组的最大值和最小值,然后比较每个子数组的最大值和最小值,以得出整个数组的最大和最小值。以下是该方法的示例代码片段:
struct Pair {
int min;
int max;
};
struct Pair getMinMax(int arr[], int low, int high) {
struct Pair minmax, left, right;
int mid;
if (low == high) {
minmax.max = arr[low];
minmax.min = arr[low];
return minmax;
}
if (high == low + 1) {
if (arr[low] > arr[high]) {
minmax.max = arr[low];
minmax.min = arr[high];
} else {
minmax.max = arr[high];
minmax.min = arr[low];
}
return minmax;
}
mid = (low + high) / 2;
left = getMinMax(arr, low, mid);
right = getMinMax(arr, mid+1, high);
if (left.min < right.min)
minmax.min = left.min;
else
minmax.min = right.min;
if (left.max > right.max)
minmax.max = left.max;
else
minmax.max = right.max;
return minmax;
}
当数组较大时,分治法通常比遍历数组的方法更为高效。
这两种方法都可以有效地查找一个数组的最大值和最小值,但它们的复杂度不同。如果数组很小,使用遍历数组的方法可能更为简单。如果数组很大,使用分治法通常效果更好。