📌  相关文章
📜  使用最少数量的比较的数组的最大值和最小值(1)

📅  最后修改于: 2023-12-03 15:06:57.039000             🧑  作者: Mango

使用最少数量的比较的数组的最大值和最小值

当我们需要在一个数组中寻找最大值和最小值时,我们通常使用两个循环,同时记录当前最大值和最小值。不过,这种方法需要进行$2n$次比较,所以当数据量很大时,时间复杂度就会非常高。

在这里,我们介绍一个只需要进行$3n/2$次比较的算法来寻找最大值和最小值。

我们先对数组的相邻两个元素进行比较,得到较大和较小的数。然后,将较大的数与当前记录的最大值比较,较小的数与当前记录的最小值进行比较,更新最大值和最小值。这个过程需要进行$3n/2$次比较。

代码实现如下:

public class MinMaxValue {
    static class Pair {
        int min;
        int max;
    }

    public static Pair getMinMax(int[] arr, int low, int high) {
        Pair pair = new Pair();
        int mid;
        Pair pair1 = new Pair();
        Pair pair2 = new Pair();

        if (low == high) {
            pair.min = arr[low];
            pair.max = arr[low];
            return pair;
        }

        if (high == low + 1) {
            if (arr[low] > arr[high]) {
                pair.max = arr[low];
                pair.min = arr[high];
            } else {
                pair.max = arr[high];
                pair.min = arr[low];
            }
            return pair;
        }

        mid = (low + high) / 2;
        pair1 = getMinMax(arr, low, mid);
        pair2 = getMinMax(arr, mid + 1, high);

        if (pair1.min < pair2.min)
            pair.min = pair1.min;
        else
            pair.min = pair2.min;

        if (pair1.max > pair2.max)
            pair.max = pair1.max;
        else
            pair.max = pair2.max;

        return pair;
    }
}

我们可以使用这个函数来查找整个数组的最大值和最小值:

int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
int n = arr.length;

Pair pair = MinMaxValue.getMinMax(arr, 0, n - 1);
System.out.println("最小值:" + pair.min);
System.out.println("最大值:" + pair.max);

这个算法的时间复杂度为$O(n)$,比传统的方法要快很多。