Как исправить сортировку чтобы работало?

Я попытался реализовать стек на массиве и его быструю сортировку Хоара, но почему то не работает. Вызывает исключение на строке mid = arr[(left + right) / 2]; N_op += 4;. Как исправить эту ошибку? И есть ли ошибки в реализации? (N_op - счетчик операций)

#include <ctime>
#include <iostream>
#include <windows.h>
const int MAX_SIZE = 3000;

using namespace std;

template <typename T>
class Stack
{
public:
    T* arr;
    int size;
    unsigned long long int N_op;

    Stack()
    {
        arr = new T[MAX_SIZE];
        size = 0;
    }

    void Push(int x)
    {
        arr[size++] = x;
        N_op += 5;
    }

    void Pop()   
    {
        size--;
        N_op += 2;
    }

    T Top() 
    {
        N_op += 3;
        return arr[size - 1];
    }

    T Size()
    {
        N_op++;
        return size;
    }

    void Sort(int N)
    {
        int mid, left, right, l, r;
        mid = left = right = l = r = 0; N_op += 6;

        Push(N - 1); N_op += 2;
        Push(0); N_op++;

        do {
            left = Top(); N_op += 2;
            Pop(); N_op++;
            right = Top(); N_op += 2;
            Pop(); N_op++;
            {
                mid = arr[(left + right) / 2]; N_op += 4;
                l = left; N_op++;
                r = right; N_op++;
                while (l < r) 
                {
                    N_op++;

                    while (arr[l] < mid) 
                    {
                        l++;
                        N_op += 4;
                    }
                    while (mid < arr[r])
                    {
                        r--;
                        N_op += 4;
                    }

                    if (l <= r)
                    {
                        swap(arr[l], arr[r]);
                        l++;
                        r--;
                        N_op += 9;
                    }
                }
            }

            if (left < r)
            {
                Push(r);
                Push(left);
                N_op += 3;
            }

            if (l < right)
            {
                Push(right);
                Push(l);
                N_op += 3;
            }
        }
        while (Size() != -1);
    }
};

int main()
{
    setlocale(LC_ALL, "Rus");
    srand(time(NULL));

    int i, t_s, t_f;

    int Key[3000];
    int N = 300;
    Stack<int> stack;

    for (i = 0; i < 3000; i++)
        Key[i] = rand() % 999;

    for (i = 0; i < 10; i++)
    {
        for (int z = N - 300; z < N; z++)
            stack.Push(Key[z]);

        stack.N_op = 0;
        t_s = GetTickCount64();
        stack.Sort(N);
        t_f = GetTickCount64();

        cout << "Номер сортировки: " << i + 1 << " | Количество отсортированных элементов: " << N << " | Время сортировки (ms): " << t_f - t_s << " | Количество операций (N_op): " << stack.N_op << endl;
        N += 300;
    }
}

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