📜  C |数组|问题11(1)

📅  最后修改于: 2023-12-03 14:59:38.558000             🧑  作者: Mango

C语言 Array 问题 11

在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;
}

当数组较大时,分治法通常比遍历数组的方法更为高效。

总结

这两种方法都可以有效地查找一个数组的最大值和最小值,但它们的复杂度不同。如果数组很小,使用遍历数组的方法可能更为简单。如果数组很大,使用分治法通常效果更好。