我的C++代码不适用于较大的随机数组
My C++ code doesn't work well for larger, random arrays
我已经编写了代码来生成一个大小为 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
而不是本机数组。
相关文章:
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- C++具有随机计数的数组
- 从C++数组中选择一个随机元素
- 为什么我的 2d 数组的第二行从 RAM 中获取随机值?
- 该程序将.csv文件中的一系列单词放入数组中,然后随机生成句子.但它不起作用
- 为什么我的数组值会更新为随机值?
- 在 c++ 的 10x10 数组中生成特定数量的多个随机字符
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- 动态数组传递给 main 中用随机值填充的函数,返回值3221226356
- 选择随机字符串数组的排序
- 如何在 3x4 数组中随机 4 个不同的位置
- 字符数组中的十六进制导致写入套接字时出现随机字符
- 更快地访问 C++ 数组中的随机元素
- 在随机生成的数组中查找重复的连续数字
- 如何将 50 行和 50 列的二维数组编码为一个为元素随机分配星号的函数?
- 生成十六进制随机 16 字节数组
- 当 95% 情况下的值为 0 或 1 时,对非常大的数组进行随机访问的任何优化
- "Color Game" - 从数组 C++ 调用随机
- 如何使用数组制作随机分数生成器