我的C++代码不适用于较大的随机数组

My C++ code doesn't work well for larger, random arrays

本文关键字:随机 数组 适用于 C++ 代码 不适用 我的      更新时间:2023-10-16

我已经编写了代码来生成一个大小为 1,000,000 的数组,并使用合并排序和插入排序算法对其进行排序,然后测量每个进程所花费的时间。它非常适合高达 100,000 的阵列大小。但是一旦我将n(数组大小(更改为 1,000,000 并编译并运行它,程序就可以工作了。我正在使用Code::Blocks 13编译器,它具有遵循c ++ 11 ISO语言标准的g ++编译器。

这是代码:

#include<iostream>
#include<climits>
#include<cstdlib>
#include<ctime>
#include<chrono>
using namespace std;
void insertion_sort(long inputSize, long  *inputArray);
void merge(long *inputArray, long low, long mid, long high);
void merge_sort(long *inputArray, long low, long high);
int main()
{
    srand(time(NULL));
    long n = 1000000;
    long inputArray1 [n];     //Declare the two arrays of size n
    long inputArray2 [n];
    cout << endl << "Unsorted List" << endl;
    for (long i = 0; i < n; i++) //initialize the arrays of size n with random n numbers
    {
        inputArray1[i] = inputArray2[i] = rand(); //Generate a random number
        //cout<<inputArray1[i]<<" ";  //Display each element in the array
    }
    std::chrono::high_resolution_clock::time_point Start = std::chrono::high_resolution_clock::now();
    insertion_sort(n, inputArray1); //calling the insertion_sort to sort the array of size n
    std::chrono::high_resolution_clock::time_point End =  std::chrono::high_resolution_clock::now();
    long long timeTaken = std::chrono::duration_cast<std::chrono::microseconds>(End - Start).count();
    cout << endl << endl << "Sorted list using Insertion Sort" << endl;
    /*for (int x=0;x<n;x++){     //Display the sorted array which was sorted using insertion_sort
          cout<<inputArray1[x]<<" "<<" ";
    }*/
    cout << endl << "Time taken = " << timeTaken << " microseconds";
    Start = std::chrono::high_resolution_clock::now();
    merge_sort(inputArray2, 0, n); //calling merge_sort to sort the array of size n
    End  = std::chrono::high_resolution_clock::now();
    timeTaken = std::chrono::duration_cast<std::chrono::microseconds>(End - Start).count();
    cout << endl << endl << "Sorted list using Merge Sort" << endl;
    /*for (int x=0;x<n;x++){     //Display the sorted array which was sorted using merge_sort
        cout<<inputArray2[x]<<" "<<" ";
     }*/
    cout << endl << "Time taken = " << timeTaken << " microseconds";
    return 0;
}
void insertion_sort(long inputSize, long *inputArray)
{
    for (long i = 1; i < inputSize; i++)
    {
        long key = inputArray[i];
        long b = i - 1;
        while ((b >= 0) && (inputArray[b] > key))
        {
            inputArray[b + 1] = inputArray[b];
            b = b - 1;
        }
        inputArray[b + 1] = key;
    }
    return;
}
void merge_sort(long *inputArray, long low, long high)
{
    if (low < high)
    {
        long mid = (low + high) / 2;
        merge_sort(inputArray, low, mid);
        merge_sort(inputArray, mid + 1, high);
        merge(inputArray, low, mid, high);
    }
    return;
}
void merge(long *inputArray, long low, long mid, long high)
{
    long n1 = mid - low + 1;
    long n2 = high - mid;
    long *L = new long [n1 + 1];
    long *R = new long [n2 + 1];
    for (long i = 0; i <= n1; i++)
    {
        L[i] = inputArray[low + i];
    }
    for (long j = 0; j <= n2; j++)
    {
        R[j] = inputArray[mid + j + 1];
    }
    L[n1] = INT_MAX;
    R[n2] = INT_MAX;
    long i = 0;
    long j = 0;
    for (long k = low; k <= high; k++)
    {
        if (L[i] <= R[j] )
        {
            inputArray[k] = L[i];
            i = i + 1;
        }
        else
        {
            inputArray[k] = R[j];
            j = j + 1;
        }
    }
    delete[] L;
    delete[] R;
    return;
}

您可以使用 new 在堆上创建数组:

long* inputArray1 = new long[n];    
long* inputArray2 = new long[n];

不要忘记在主目录末尾删除它。

long n=1000000;
long inputArray1 [n];    
long inputArray2 [n];

首先,可变长度数组在标准C++中无效,n应该const

假设long是 4 个字节,这两个数组占用 8MB 的堆栈大小,这比普通堆栈的大小还要大。由于堆栈溢出,程序崩溃。

若要解决此问题,请使用 std::vector 而不是本机数组。