**关闭。**此题需要debugging details。目前不接受答复。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
13小时前关闭
Improve this question
我试着测试和计算合并和插入排序对数组进行排序所需的时间。
正如你所看到的,我使用兰德()来生成随机整数,无论出于什么原因,如果我使用int asize = rand()% 100(或任何小数字),它都可以工作,但我需要更大的数字来测试这两个算法。
#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;
void generateArray(int arr[], int asize)
{
for(int i = 0; i < asize; i++)
{
arr[i] = rand();
}
}
void insertionSort(int arr[], int size)
{
for (int i = 1; i < size; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
void merger(int arr[], int left, int mid, int right)
{
int n1 = mid - left + 1;
int n2 = right - mid;
int leftArr[n1];
int rightArr[n2];
for (int i = 0; i < n1; ++i)
leftArr[i] = arr[left + i];
for (int j = 0; j < n2; ++j)
rightArr[j] = arr[mid + 1 + j];
int i = 0;
int j = 0;
int k = left;
while (i < n1 && j < n2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
} else {
arr[k] = rightArr[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = leftArr[i];
i++;
k++;
}
while (j < n2) {
arr[k] = rightArr[j];
j++;
k++;
}
}
void mergeSort(int arr[], int left, int right)
{
if (left < right)
{
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merger(arr, left, mid, right);
}
}
void printArray(int arr[], int size)
{
for (int i = 0; i < size; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
// % 1000 to generate a value between 0 and 999
int asize = rand();
int forMerge[asize];
generateArray(forMerge, asize);
auto forInsertion = forMerge;
auto startMerge = high_resolution_clock::now();
mergeSort(forMerge, 0, asize - 1);
auto stopMerge = high_resolution_clock::now();
auto durationMerge = duration_cast<nanoseconds>(stopMerge - startMerge);
cout << "Time to finish merge sort: " << durationMerge.count() << endl;
// printArray(forMerge, asize);
auto startInsertion = high_resolution_clock::now();
insertionSort(forInsertion, asize);
auto stopInsertion = high_resolution_clock::now();
auto durationInstertion = duration_cast<nanoseconds>(stopMerge - startMerge);
cout <<"Time to finish instertion sort: " << durationInstertion.count() << endl;
// printArray(forInsertion, asize);
}
我尝试了int asize =兰德()% 99;它是有效的,但我需要更大的数字,因为我想测试这些不同的算法。
2条答案
按热度按时间e4yzc0pl1#
数组
forMerge
正在堆栈上分配。堆栈大小不是无限的;通常只有几兆字节。大型数组应该在堆上分配。如果你像这样重写它,你会发现它适用于任何大小:
或者更好:
顺便说一下,你不应该在可移植程序中使用
rand()
来生成大的数字,因为它生成的值在0和兰德_MAX之间,并且RAND_MAX不能保证大于32767。wydwbb8l2#
在main的第二行创建asize变量之后,立即执行以下语句:“printf(“asize %d\n”);你会看到它有一个在10亿到20亿之间的随机数。下一条指令尝试打开一个具有此数据量的数组。这会导致分段故障(核心转储)。
尝试较小的数量:int maximum();
并分配内存:int * forMerge =(int*)malloc(sizeof(int)* asize);