C++ C+中的迭代合并排序+;

C++ C+中的迭代合并排序+;,c++,sorting,iteration,mergesort,C++,Sorting,Iteration,Mergesort,我目前正在开发mergesort的迭代版本,但遇到了一个问题。当存在特定大小的数组,如34、35、36或100(仅少数示例)时,程序会崩溃,而其余的则会崩溃(fe适用于2的幂)。我已经运行了一些测试并对其进行了调试,问题似乎在于我的迭代范围/mergesort的左、右半部分,但我找不到它。我将感谢你的帮助。 代码: int*loadArray(int size){//i输入数组的大小并分配随机数 int*数组=新的int[大小]; srand(时间(空)); 对于(int i=0;i

我目前正在开发mergesort的迭代版本,但遇到了一个问题。当存在特定大小的数组,如34、35、36或100(仅少数示例)时,程序会崩溃,而其余的则会崩溃(fe适用于2的幂)。我已经运行了一些测试并对其进行了调试,问题似乎在于我的迭代范围/mergesort的左、右半部分,但我找不到它。我将感谢你的帮助。 代码:

int*loadArray(int size){//i输入数组的大小并分配随机数
int*数组=新的int[大小];
srand(时间(空));
对于(int i=0;i如果(左[i]
int左[n1],右[n2]数组是必须的,但不是C++,数组是必须的,它是无效的ANSI C++。数组必须用编译时表达式来声明,而不是运行时值。而且,代码中有巨大的内存泄漏。使用<代码> STD::vector < /COD>代替数组——它同时处理内存泄漏和非标准C++代码。考虑内存泄漏,我在主删除之后删除数组。你的意思是它不是标准的ANSI吗?请你详细说明一下。你不能将具有索引数的数组声明为运行时值。你的编译器支持称为可变长度数组(VLA)的非标准扩展。使用适当的ANSI开关编译,你会得到编译器错误声明(如果是gcc,则应为
-Wall-pedantic
)。另外,不要使用随机数进行测试。--如果排序例程出现问题,请始终使用一组可能重复该问题的已知数字进行测试。使用随机数进行测试,您将更难确定问题所在,因为每次运行程序时,数字都会不断变化。请使用
std::vector
,并且显示有一个大问题,您的人造(我称之为)数组版本没有显示给您。数组声明中的
n2
值在该数据集上为负值。相比之下,(联机编译器支持VLA)。当您使用非标准语法时,错误完全隐藏。
int * loadArray(int size){ //i input size of array and it assigns random numbers
    int *array = new int[size];

     srand( time( NULL ) );

    for( int i = 0; i < size; i++ )
        array[i]=rand()%100;

    return array;
}




void merge(int arr[], int left, int middle, int right)
{
    int i, j, k;              //iterators
    int n1 = middle-left + 1; //indexes
    int n2 = right-middle;    //indexes
    int Left[n1], Right[n2];  //arrays holding halves

for (i = 0; i < n1; i++)
    Left[i] = arr[left + i];//assigning values to left half
for (j = 0; j < n2; j++)
    Right[j] = arr[middle + 1+ j];//assigning values to right half

i = 0;
j = 0;
k = left;
while (i < n1 && j < n2)    //comparing and merging
{
    if (Left[i] <= Right[j])
    {
        arr[k] = Left[i];
        i++;
    }
    else
    {
        arr[k] = Right[j];
        j++;
    }
    k++;
}

while (i < n1)  //leftovers
{
    arr[k] = Left[i];
    i++;
    k++;
}

while (j < n2)  //leftovers
{
    arr[k] = Right[j];
    j++;
    k++;
}
}




void mergeSortIter(int array[], int size) //the function which is being called and handles division of the array
{
    double startTime = clock(); //start measuring time

    int i;
    int left_start;

   for (i=1; i<=size-1; i = 2*i)
   {
       for (left_start=0; left_start<size-1; left_start += 2*i)
       {
            int mid = left_start + i - 1;
            int right_end = min(left_start + 2*i - 1, size-1);
            merge(array, left_start, mid, right_end);
       }
       //showArray(array,size);
   }
    cout << double( clock() - startTime ) / (double)CLOCKS_PER_SEC<< " seconds." << endl; //output the time measured
}