设计MERGE-SORT算法 - 非常棘手的问题! “std :: bad_alloc在内存位置0x00486F78。”

时间:2015-03-14 06:27:07

标签: c++ algorithm c++11 visual-studio-2012

这是针对算法类中的赋值。我理解并同意使用矢量会简化事情,但这不是一种选择。 Mergesort / merge算法的代码也不能修改。

我需要按如下方式运行合并排序: 从100开始一直到1000,增量为100.对于每个增量,我运行5次,每次运行1000次。

话虽如此 - 一切正常,直到我的循环达到700并因错误而崩溃:msdebug.exe中的0x75612F71处的未处理异常:Microsoft C ++异常:内存位置0x010672F4处的std :: bad_alloc。“

这是我的代码:

int const size = 6;
int const size2 = 1001;
int const times = 6;
int const interval = 11;  

void merge(int arr[], int p, int q, int r)
    {
        int n1 = q - p + 1;
        int n2 = r - q;
        int * L = new int[n1 + 1];
        int * R = new int[n2 + 1];    // line giving the error after 700
        for (int i = 1; i <= n1; i++)
        {
            L[i] = arr[p + i - 1];
        }
        for (int j = 1; j <= n2; j++)
        {
            R[j] = arr[q + j];
        }
        L[n1 + 1] = 32768;
        R[n2 + 1] = 32768;
        int i, j;
        i = j = 1;
        for (int k = p; k <= r; k++)
        {
            if (L[i] <= R[j])
            {
                arr[k] = L[i];
                i++;
            }
            else
            {
                arr[k] = R[j];
                j++;
            }
        }


    }

    void mergeSort(int arr[], int p, int r)
    {
        int q;
        if (p < r)
        {
            q = ((p + r) / 2);
            mergeSort(arr, p, q);
            mergeSort(arr, (q + 1), r);
            merge(arr, p, q, r);


        }
    }

    void copyArray(int original[][size2], int copy[], int row, int finish)
    {
        int i = 1;
        while (i <= finish)
        {
            copy[i] = original[row][i];
            i++;
        }

    }
    void copyOneD(int orig[], int cop[])
    {
        for (int i = 1; i < size2; i++)
        {
            cop[i] = orig[i];
        }
    }



    int main()
    {
        struct timeval;

        clock_t start, end;
        srand(time(NULL));

        int arr[size][size2];
        int arr2[size2];
        int arrCopy[size2];
        double tMergeSort[times][interval];
        double avgTmergeSort[11];


        /*for (int i = 1; i < (size2); i++)
        {
             arr2[i] = rand();
        }*/

        for (int i = 1; i < size; i++)
        {
            for (int j = 1; j < size2; j++)
            {
                arr[i][j] = rand();
            }
        }


    for (int x = 100; x <= 1000; x = x + 100)   //This loop crashes >=700
        {
            for (int r = 1; r <= 5; r++)
            {
                copyArray(arr, arr2, r, 1001);

                for (int k = 0; k < 1000; k++)
                {
                    copyOneD(arr2, arrCopy);
                    mergeSort(arrCopy, 1, x);
                }
            }
        }


        return 0;
    }

您可以忽略代码和数组。这些功能很好。 一切正常,直到我设置'x <= 700'或更高,然后它崩溃。

我有一个理论认为计算机的合并算法中的指针可能会耗尽内存但是当我尝试使用删除时它也会崩溃。

任何帮助都表示赞赏和建议。

由于

0 个答案:

没有答案