【发布时间】:2012-10-21 17:51:42
【问题描述】:
这个程序需要两个输入。第一个数组大小(n)和选择 例如:- 如果 n 为 100,则我的程序生成 100 个随机数并使用合并对它们进行排序 排序和快速排序。
现在如果您输入choice==2,则显示两种排序算法所花费的时间
我的程序可以在输入大小 10^8 下工作,但我希望它可以在 10"10 下工作。如果我输入输入大小 10^9,则会出现分段错误。分配大量内存时存在问题 .malloc 返回 null如果输入大小超过 10^9
谁能告诉我如何提高我的程序的输入大小............
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
long long merge(int *A,long long i,long long mid,long long j)
{
int *C;
C=(int *)malloc(sizeof(int)*(j-i+1));
long long r,start,k;
r=0;
start=i;
k=mid+1;
while((i<=mid)&&(k<=j))
{
if(A[i]>A[k])
{
C[r]=A[k];
r++;k++;
}
else
{
C[r]=A[i];
r++;i++;
}
}
while(i<=mid)
{
C[r]=A[i];
r++;i++;
}
while(k<=j)
{
C[r]=A[k];
r++;k++;
}
for(i=0;i<r;i++,start++)
A[start]=C[i];
free(C);
}
long long partition(int *A,long long i,long long j)
{
long long mid;
mid=(i+j)/2;
if(i<j)
{
partition(A,i,mid);
partition(A,mid+1,j);
merge(A,i,mid,j);
}
}
long long find_position(int A[],long long i,long long j)
{
long long pivot,temp,end;
end=j;
pivot=i;
while(i<j)
{
while(A[i]<=A[pivot]&&i<end)
i++;
while(A[j]>A[pivot])
j--;
if(i<j)
{
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
temp=A[pivot];
A[pivot]=A[j];
A[j]=temp;
return j;
}
long long quicksort(int A[],long long i,long long j)
{
long long position;
if(j>i)
{
position = find_position(A,i,j);
quicksort(A,i,position-1);
quicksort(A,position+1,j);
}
}
int main()
{
clock_t start,end,quick_sort,merge_sort;
long long input_size,i;
int choice,x;
srand(time(NULL));
printf("Enter input Size\n");
scanf("%lld",&input_size);
int *A,*B;
printf("input your choice\n");
scanf("%d",&choice);
A=(int *)malloc(input_size*sizeof(int));
B=(int *)malloc(input_size*sizeof(int));
if(A==NULL||B==NULL)
{
printf("sorry that much memory can't be allocated\n");
return 0;
}
for(i=0;i<input_size;i++)
{
x=rand();
A[i]=x;
B[i]=x;
}
if(choice==1)
{
printf("Array entered by user\n");
for(i=0;i<input_size;i++)
printf("%d ",A[i]);
}
start=clock();
partition(A,0,input_size-1);
end=clock();
merge_sort=end-start;
if(choice==2)
printf("\n time taked by merge sort is %6.6f",((double)(merge_sort)/CLOCKS_PER_SEC));
if(choice==1)
{
printf("\nmerge sorted array\n");
for(i=0;i<input_size;i++)
printf("%d ",A[i]);
}
start=clock();
quicksort(B,0,input_size-1);
end=clock();
quick_sort=end-start;
if(choice==2)
printf("\n time taked by quick sort is %6.6f",((double)(quick_sort)/CLOCKS_PER_SEC));
if(choice==1)
{
printf("\nquick sorted array\n");
for(i=0;i<input_size;i++)
printf("%d ",B[i]);
}
printf("\n");
return 0;
}
【问题讨论】:
-
什么操作系统和编译器?
-
它可能超过了 2GB 的限制。
-
当我看到这个:
mid=(i+j)/2;(虽然你使用的是long long)它总是提醒我这个:googleresearch.blogspot.ch/2006/06/… -
10 ^ 10 对于 64 位机器来说应该没问题,比如说 96GB RAM(100 亿整数 = 40GB,你分配了 两次)。 32 位机器只能访问 2GB 工作内存。您可能应该重新考虑您的问题,这行不通...
-
@fvu cmets 有一个“编辑”选项。
标签: c