Для каждой функции в следующем коде:
std::pair<int, int> findMinElement(int arr[], int size) {
    int minElement = arr[0];
    int minIndex = 0;

    for (int i = 1; i < size; i++) {
        if (arr[i] < minElement) {
            minElement = arr[i];
            minIndex = i;
        }
    }

    return std::pair<int, int>(minElement, minIndex);
}


void bubbleSort(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int binarySearch(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;

        if (arr[mid] == target) {
            return mid;
        }
        else if (arr[mid] < target) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }

    return -1;
}

int* findMinElement(int arr[][3], int rows, int cols) {
    int minElement = arr[0][0];
    int minRow = 0;
    int minCol = 0;

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (arr[i][j] < minElement) {
                minElement = arr[i][j];
                minRow = i;
                minCol = j;
            }
        }
    }
    return new int[3] {minElement, minRow, minCol};
}

void reverseArray(int arr[], int size) {
    int start = 0;
    int end = size - 1;

    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;

        start++;
        end--;
    }
}

void leftRotate(int arr[], int size, int positions) {
    for (int i = 0; i < positions; i++) {
        int temp = arr[0];

        for (int j = 0; j < size - 1; j++) {
            arr[j] = arr[j + 1];
        }

        arr[size - 1] = temp;
    }
}

void replaceElements(int arr[], int size, int target, int replacement) {
    for
        (int i = 0; i < size; i++) {
        if (arr[i] == target) {
            arr[i] = replacement;
        }
    }
}
Вычисли параметры:
η*2 – число единых по смыслу входных и выходных параметров, представленных
в сжатой без избыточной форме;
η1 - число отдельных операторов;
η2 - число отдельных операндов;
η - длина словаря реализации;
N1 - общее число вхождений всех операторов в реализацию;
N2 - общее число вхождений всех операндов в реализацию;
N - длина реализации;
N^ - предсказанная длина реализации по соотношению Холстеда;
V* – потенциальный объем реализации: V* = (2 + η*2)*log2(2+η*2);
V – объем реализации: V  = N * log2η
L - уровень программы через потенциальный объем: L = V*/V;
L^ - уровень программы по реализации: L^ = (2/η1)*(η2/N2);
I - интеллектуальное содержание программы: I = (2/η1)*(η2/N2) * (N1 + N2) * log2(η1 + η2);
T^1 - прогнозируемое время написания программы, выраженное через
потенциальный объем: T^1= (V^2)/(S*V*);
T^2 - прогнозируемое время написания программы, выраженное через длину
реализации, найденную по Холстеду (т.е. в предположении, что программа
совершенна): (η1*N2*(η1*log2η1+η2*log2η2)*log2η)/(2*S*η2);
T^3 - прогнозируемое время написания программы, выраженное через
метрические характеристики реализации: T^3 = (η1 * N2 * N * log2η)/(2 * S * η2); 
3. По всем реализациям алгоритмов определить средние значения уровней языков
программирования : 
λ1 = (L^)^2 * V;
λ2 = (V*)^2 / V;