gpt4 book ai didi

c - 程序过多时崩溃

转载 作者:行者123 更新时间:2023-12-02 06:38:48 24 4
gpt4 key购买 nike

我正在尝试在C语言中创建merge sort algorithm。问题是它不适用于大量元素。如果数组具有100000个元素,则可以,但是如果数组具有1e6或1e7,则会崩溃。我以为您不能为数组提供这么多的元素,但是在我读到事实并非如此之后,您应该能够给出1e7元素。之后,我认为int的范围可能很小,但事实并非如此,int达到了1e9。我真的不知道问题出在哪里,为什么它不起作用,所以请帮忙。提前致谢!

#include <stdio.h>
#include <stdlib.h>

int n;
void merge(int *, int, int);
void mergeSort(int *, int, int);
void bubbleSort(int *, int);

int main() {
// scanf("%d",&n);
n = 10000000;
int *a = (int *)malloc(n * sizeof(int));
if (a == NULL) {
printf("Nu s-a putut aloca memorie.");
exit(0);
}
for (int i = 0; i < n; i++)
a[i] = rand() % 50;

mergeSort(a, 0, n - 1);
//bubbleSort(a, n - 1);

// for (int i = 0; i < n; i++) {
// printf("%d ", a[i]);
// }
free(a);
return 0;
}

void merge(int *a, int start, int sfarsit) {
int mij = (start + sfarsit) / 2;
int i = start;
int j = mij + 1;
int k = start;
int aux[10000000];

while (i <= mij && j <= sfarsit) {
if (a[i] < a[j])
aux[k++] = a[i++];
else
aux[k++] = a[j++];
}
while (i <= mij)
aux[k++] = a[i++];
while (j <= sfarsit)
aux[k++] = a[j++];
for (int i = start; i <= sfarsit; i++)
a[i] = aux[i];
}

void mergeSort(int *a, int start, int sfarsit) {
if (start >= sfarsit)
return ;

int mij = (start + sfarsit) / 2;

mergeSort(a, start, mij);
mergeSort(a, mij + 1, sfarsit);
merge(a, start, sfarsit);
}

最佳答案

这个:

int aux[10000000];

是问题。对于堆栈来说,这将是非常重要的。更改为此:
int *aux = malloc(sizeof(*aux) * 10000000);

当然,您需要在函数 free(aux)的末尾使用 merge并检查分配是否成功。

另外,您当然应该分配有关 sfarsit的内容,但是从您的其他代码来看,似乎我不需要告诉您。

关于c - 程序过多时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61955262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com