如何修复Sort()?

发布于 2025-02-10 05:38:45 字数 2902 浏览 1 评论 0原文

我试图在数组及其Hoare快速排序上实现堆栈,但是由于某种原因,它行不通。在行上抛出异常mid = arr [(左 +右) / 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;
    }
}

I tried to implement a stack on an array and its Hoare quick sort, but for some reason it doesn't work. Throws an exception on the line mid = arr[(left + right) / 2]; N_op += 4;. How to fix this error? And are there any errors in the implementation? (N_op - operation counter)

#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;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文