c++ - 归并排序中的动态内存分配

标签 c++ sorting pointers dynamic merge

我写了一个归并排序程序(我写了基本算法)- 它运行良好。但是,由于我必须从一个非常大的文件中读取整数,所以我想在递归调用中动态声明数组。因此我写了下面的代码,但是它给了我一些错误,你能帮我找出我在哪里犯了错误吗?

程序实际上是统计一个数组的倒置次数(如果 i < j 且 arr[i]>arr[j] ,那么这是一个倒置)。我写的程序如下: 我不想每次进行递归调用时都在堆栈上声明一个包含 10000 个整数的数组

我得到的错误是:std::bad_alloc at memory location 0x004dd940.. 我已经编辑了问题,因此它包含错误消息。执行中断,visual studio 进入 Debug模式并打开文件 osfinfo.c

    #include<stdio.h>
    #include <iostream>
    using namespace std;
    unsigned int mixAndCount(int * arr,int low, int mid,int high) {
        int *num = new int[high-low+1];// THIS IS WHERE THE ERROR OCCURS
        int l = low ;
        int r = mid+1;
        unsigned int count=0;
        int i =low;

        while((l<=mid)&&(r<=high))
     {
      if(arr[l]<=arr[r])
      {
       num[i]=arr[l];
       l++;

      }
      else
      {
      num[i]=arr[r];
       r++;
       count=count + (mid-l+1);

      }
      i++;
         }
     if(l>mid)
     {
      for(int k=r;k<=high;k++)
      {
       num[i]=arr[k];
       i++;
        }
     }
     else
     {
      for(int k=l;k<=mid;k++)
      {
       num[i]=arr[k];
       i++;
        }
     }
     for(int k=low;k<=high;k++) arr[k]=num[k];
delete[] num;    
return count;
    }

    unsigned int mergeAndCount(int * arr, int low , int high ) {
        if(low>=high) {
        return 0;
        }
        else {
            int mid = (low+high)/2;

            unsigned int left = mergeAndCount(arr, low , mid);
            unsigned right = mergeAndCount(arr, mid+1, high);
            unsigned int split = mixAndCount(arr, low , mid , high);
            return left+right+split;

        }

    }
    int main ()
    {
        int  numArr[100000];
        FILE * input = fopen("IntegerArray.txt", "r");
        int i =0;
        while(!feof(input)) {
            int num;
        fscanf(input, "%d", &num);
        numArr[i] = num;
        i++;
        }
        fclose(input);
        unsigned int count = mergeAndCount(numArr,0, i-1  );
        cout<<count<<endl;
        return 0;
    }

最佳答案

 std::bad_alloc at memory location 0x004dd940..

new 无法成功分配请求的内存时抛出的异常。

int *num = new int[high-low+1];  

似乎请求的内存大小太大,这意味着您需要跟踪 highlow 的值。

关于c++ - 归并排序中的动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12542840/

相关文章:

c++ - Visual Studio C++ 中的运行时错误

c++ - 无法在 Windows 中以编程方式 (C++) 从其他用户帐户读取文件

iphone - 对具有类对象的数组进行排序

c - 如何使用指针在声明后更改变量

我可以释放最初从另一个指针分配的内存吗?

c++ - Omnet++:多维 vector 作为输入

c++ - 如何从 C++ 访问特定 QML 控件的事件

java - 快速排序 - 相等检查的原因

python - 在 Python 中对多维字典进行排序

c 中的 Char* 错误