Как можно вычислить количество используемой алгоритмом дополнительной памяти? С++

Есть функции разных методов сортировок. Нужно вычислить количество используемой алгоритмом дополнительной памяти для каждого метода. Видел что через new и delete как-то можно, но то ли это будет.

#include <iostream>
#include <chrono>
#include <math.h>
using namespace std;
const int RUN = 32;


void InsertionSort(int arr[], const int n, int & basic_assignments, int & assitiev_assignments,
    chrono::duration<float> & time) {

    auto start = chrono::high_resolution_clock::now();

    basic_assignments = 0;
    assitiev_assignments = 0;
    
    for (int i = 1; i < n; i++)
    {

        int x = arr[i];
        int j = i;

        while ((j > 0) && (arr[j - 1] > x)) {
            arr[j] = arr[j - 1];
            j--;

            basic_assignments += 1;
            assitiev_assignments += 1;
        }

        arr[j] = x;

        basic_assignments += 2;
        assitiev_assignments += 2;
    }

    auto end = chrono::high_resolution_clock::now();
    time = end - start;
}


void NaturalMergeSort(int arr[], int n, int& basic_assignments, int& assitiev_assignments,
    chrono::duration<float>& time) {

    auto start = chrono::high_resolution_clock::now();

    basic_assignments = 0;
    assitiev_assignments = 0;

    int split, last, end, i;
    int* p = arr;
    char flag = 0, sorted = 0;
    int pos1, pos2, pos3;
    int *tmp = new int[n];

    do
    {
        end = n; pos2 = pos3 = 0;
        do
        {
            p += pos2; end = n - pos3;
            for (split = 1; split < end && p[split - 1] <= p[split]; split++);

            if (split == n)
            { 
                sorted = 1;
                assitiev_assignments += 1;
                break;
            }
            pos1 = 0; pos2 = split;

            while (pos1 < split && pos2 < end)
            {
                if (p[pos1] < p[pos2])
                {
                    tmp[pos3++] = p[pos1++];
                    basic_assignments += 1;
                }
                    
                else
                {
                    tmp[pos3++] = p[pos2++];
                    basic_assignments += 1;

                    if (p[pos2] < p[pos2 - 1])
                        break;
                }
            }
        
            while (pos2 < end && tmp[pos3 - 1] <= p[pos2])
            {
                tmp[pos3++] = p[pos2++];
                basic_assignments += 1;
            }

            while (pos1 < split)
            {
                tmp[pos3++] = p[pos1++];
                basic_assignments += 1;
            }

            assitiev_assignments += 4;

        } while (pos3 < n);

        if (sorted)
            break;

        p = tmp;
        tmp = arr;
        arr = p;
        flag = !flag;

        basic_assignments += 3;
        assitiev_assignments += 4;

    } while (split < n);

    if (flag)
    {
        for (pos1 = 0; pos1 < n; pos1++)
        {
            tmp[pos1] = arr[pos1];

            basic_assignments += 1;
            assitiev_assignments += 1;
        }

        delete [] p;
    }
    else
        delete [] tmp;

    basic_assignments += 1;
    assitiev_assignments += 3;

    auto _end = chrono::high_resolution_clock::now();
    time = _end - start;
}


void ShellSort(int arr[], int n, int& basic_assignments, int& assitiev_assignments,
    chrono::duration<float>& time) {

    auto start = chrono::high_resolution_clock::now();

    basic_assignments = 0;
    assitiev_assignments = 0;

    const int t = log(n) / log(2) - 1;
    int i, j, k, m, x;

    int* h = new int[t];
    h[t - 1] = 1;

    for (m = t - 2; m >= 0; m--)
    {
        h[m - 1] = h[m + 1] * 2 + 1;
        assitiev_assignments += 2;
    }

    for (m = 0; m < t; m++) 
    {
        k = h[m];
        for (i = k; i < n; i++)
        {
            x = arr[i];
            j = i - k;

            while (j >= 0 && x < arr[j])
            {
                arr[j + k] = arr[j];
                j -= k;

                basic_assignments += 1;
                assitiev_assignments += 1;
            }

            arr[j + k] = x;

            basic_assignments += 2;
            assitiev_assignments += 2;
        }

        assitiev_assignments += 2;
    }

    delete [] h;

    assitiev_assignments += 3;

    auto end = chrono::high_resolution_clock::now();
    time = end - start;
}


void main(){

}

Ответы (1 шт):

Автор решения: Harry

Вам надо до байта или через O?

Если интересует асимптотика...

Смотрим: InsertionSort — вы не выделяете никакой памяти, только локальные переменные в определенном, не зависящем от размера массива количестве. Итог: O(1)

NaturalMergeSort: в вашей реализации выделяется один раз массив размером n элементов. Больше никакого выделения нет, рекурсии нет. Итог: O(n)

ShellSort: опять однократное выделение log(n) / log(2) - 1 элементов. Итог: O(log(n)).

Это устраивает?

→ Ссылка