find the minimum and maximum in the list in C++

How to find the minimum and maximum in the list in C++?

In this tutorial, we will learn about How to find the minimum and maximum in the list in C++. A list, in this context, refers to a collection of elements stored in a sequential manner. It can also be thought of as an array. In C++, you can use data structures like std::vector or plain arrays (int[]) to represent lists.

Different Approaches to find min and max in the list

One approach involves directly comparing the elements in the array. This involves examining each element individually and determining the maximum and minimum values through comparisons.

You can achieve this through two distinct methods:

  • The Iterative Approach
  • The Recursive Approach

By using the Iterative Approach

Iterative methods use loops, typically for or while loops, to address a problem by executing a defined set of instructions repeatedly until they satisfy a specific condition or reach a specific number of iterations. In this scenario, a loop is used to traverse the list and identify its minimum and maximum values.

In the iterative method of discovering the list’s minimum and maximum values, you usually set variables like min_value and max_value to initial values (such as the first element in the list). Then, you employ a loop to traverse the list, where you compare each element with these variables and modify them whenever you come across a smaller or larger value.

Example:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 9, 4};
    
    if (numbers.empty()) {
        std::cout << "List is empty." << std::endl;
        return 1; // Exit with an error code
    }

    int min_value = numbers[0]; // Assume the first element is the minimum
    int max_value = numbers[0]; // Assume the first element is the maximum

    for (int i = 1; i < numbers.size(); ++i) {
        if (numbers[i] < min_value) {
            min_value = numbers[i];
        }
        if (numbers[i] > max_value) {
            max_value = numbers[i];
        }
    }

    std::cout << "Minimum: " << min_value << std::endl;
    std::cout << "Maximum: " << max_value << std::endl;

    return 0;
}


Output:

Minimum: 1
Maximum: 9

This code iterates through the list and updates the min_value and max_value variables as it encounters smaller or larger elements, respectively. It starts with the assumption that the first element is both the minimum and maximum. It compares each subsequent element to find the actual minimum and maximum values.

By using the Recursive Approach

This recursive approach efficiently divides the problem into smaller subproblems, reducing the number of comparisons needed to find the minimum and maximum values in the list.

  • Problem Statement: Given a list (or array) of integers, we want to find the minimum and maximum values in the list.
  • Recursive Function (findMinMax): The recursive function findMinMax takes the following parameters:
    • numbers: The list of integers.
    • start: The index representing the start of the current sublist.
    • end: The index representing the end of the current sublist.
  • Base Cases:
    • If start is equal to end, which means that there is only one element in the current sublist. In this case, we return an instance of the MinMax struct where both min_val and max_val are set to this single element.
    • If start is one less than end, it means there are two elements in the current sublist. In this case, we compare the two elements and return an instance of the MinMax struct with the smaller element as min_val and the larger element as max_val.
  • Recursive Case:
    • If the current sublist has more than two elements, we divide it into two halves. We calculate the midpoint index mid as (start + end) / 2.
    • We recursively call findMinMax on the left half of the sublist (from start to mid) and the right half of the sublist (from mid + 1 to end).
    • We obtain the minimum and maximum values from both the left and right sublists.
    • Finally, we combine the minimum and maximum values from the left and right sublists to compute. It overall minimum and maximum values for the entire sublist.
  • Result: The findMinMax function returns an instance of the MinMax struct that contains the minimum and maximum values found within the specified sublist.
  • Main Function: In the main function, we initialize the list of integers, call the findMinMax function on the entire list, and print out the minimum and maximum values.

Example:

#include <iostream>
#include <vector>

struct MinMax {
    int min_val;
    int max_val;
};

MinMax findMinMax(const std::vector<int>& numbers, int start, int end) {
    MinMax result;

    // Base case: If the list has only one element
    if (start == end) {
        result.min_val = numbers[start];
        result.max_val = numbers[start];
        return result;
    }

    // Base case: If the list has two elements
    if (start == end - 1) {
        result.min_val = std::min(numbers[start], numbers[end]);
        result.max_val = std::max(numbers[start], numbers[end]);
        return result;
    }

    // Recursive case: Divide the list into two halves
    int mid = (start + end) / 2;
    MinMax left = findMinMax(numbers, start, mid);
    MinMax right = findMinMax(numbers, mid + 1, end);

    // Combine the results from the left and right sublists
    result.min_val = std::min(left.min_val, right.min_val);
    result.max_val = std::max(left.max_val, right.max_val);

    return result;
}

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 9, 4};
    
    if (numbers.empty()) {
        std::cout << "List is empty." << std::endl;
        return 1; // Exit with an error code
    }

    MinMax result = findMinMax(numbers, 0, numbers.size() - 1);

    std::cout << "Minimum: " << result.min_val << std::endl;
    std::cout << "Maximum: " << result.max_val << std::endl;

    return 0;
}


Output:

Minimum: 1
Maximum: 9

In this code, the findMinMax function takes a range of indices (start and end) and recursively divides the list into smaller sublists until it reaches the base cases (a single element or two elements). It then combines the minimum and maximum values from the left and right sublists to find the overall minimum and maximum for the entire list.