gpt4 book ai didi

c - 当数组大小为一百万时程序崩溃

转载 作者:太空狗 更新时间:2023-10-29 16:08:21 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Big array gives segmentation error in C

我正在尝试比较不同输入大小(如 10.000、100.000 和 1.000.000)的合并排序和快速排序。但是,当我给出一百万个输入大小时,程序崩溃了,我不知道为什么?另一方面,数组中充满了从包含数字的文件中读取的内容,这是我的简单合并排序。

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

#define SIZE 1000000

void Merge(int * , int , int , int );
void MergeSort(int *array, int left, int right);

int main(){

struct timeval tv;
struct timezone tz;
struct tm *tm;
long start,stop;

long i,num;
int array[SIZE];

FILE* fptr;

gettimeofday(&tv, &tz);
tm = localtime(&tv.tv_sec);
printf("TIMESTAMP-START\t %d:%02d:%02d:%d (~%d ms)\n", tm->tm_hour,
tm->tm_min, tm->tm_sec, tv.tv_usec,
tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000);

start = tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 + tm->tm_sec * 1000 + tv.tv_usec / 1000;

fptr = fopen ("onemillion.txt","r");

for(i=0; i<SIZE-1; i++){

fscanf(fptr,"%d",&num);
array[i]=num;
}

MergeSort(array,0,SIZE-1);

/*for(i = 0;i < SIZE;i++)
{
printf("%d \n",array[i]);
}*/

gettimeofday(&tv, &tz);
tm = localtime(&tv.tv_sec);
stop = tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000;
printf("TIMESTAMP-END\t %d:%02d:%02d:%d (~%d ms) \n", tm->tm_hour,
tm->tm_min, tm->tm_sec, tv.tv_usec,
tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000);

printf("ELAPSED\t %d ms\n", stop - start);

return 0;

}

void MergeSort(int *array, int left, int right)
{
int mid = (left+right)/2;
/* We have to sort only when left<right because when left=right it is anyhow sorted*/
if(left<right)
{
/* Sort the left part */
MergeSort(array,left,mid);
/* Sort the right part */
MergeSort(array,mid+1,right);
/* Merge the two sorted parts */
Merge(array,left,mid,right);
}
}

void Merge(int *array, int left, int mid, int right)
{
/*We need a Temporary array to store the new sorted part*/
int tempArray[right-left+1];
int pos=0,lpos = left,rpos = mid + 1;
while(lpos <= mid && rpos <= right)
{
if(array[lpos] < array[rpos])
{
tempArray[pos++] = array[lpos++];
}
else
{
tempArray[pos++] = array[rpos++];
}
}
while(lpos <= mid) tempArray[pos++] = array[lpos++];
while(rpos <= right)tempArray[pos++] = array[rpos++];
int iter;
/* Copy back the sorted array to the original array */
for(iter = 0;iter < pos; iter++)
{
array[iter+left] = tempArray[iter];
}
return;
}

当我尝试使用一千、一万和十万时都没有问题。正如我所说,我在 100 万输入规模上挣扎。我不确定,但我想这是关于使用数组?如果您能提供帮助,我会很高兴,无论如何谢谢。

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