Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 合并排序不';不适用于包含521096个元素以上的整数表_C_Sorting_Mergesort - Fatal编程技术网

C 合并排序不';不适用于包含521096个元素以上的整数表

C 合并排序不';不适用于包含521096个元素以上的整数表,c,sorting,mergesort,C,Sorting,Mergesort,我正在尝试使用不同类型的排序算法(如快速排序、冒泡排序和合并排序)对一个大的整数表进行排序,所有这些算法都工作得很好。但是,当尝试使用Merge sort对包含521096个以上元素的表进行排序时,程序只会退出而不会抛出任何错误(我猜在C中这是一个运行时错误) 请注意,合并排序可以完美地处理包含少于921096个元素的表。 另外请注意,例如,快速排序可以很好地处理任意长度的表(我尝试了多达100万个元素) 以下是我正在使用的代码: void fillTable(int *t,int n){

我正在尝试使用不同类型的排序算法(如快速排序、冒泡排序和合并排序)对一个大的整数表进行排序,所有这些算法都工作得很好。但是,当尝试使用Merge sort对包含521096个以上元素的表进行排序时,程序只会退出而不会抛出任何错误(我猜在C中这是一个运行时错误)

请注意,合并排序可以完美地处理包含少于921096个元素的表。 另外请注意,例如,快速排序可以很好地处理任意长度的表(我尝试了多达100万个元素)

以下是我正在使用的代码:

void fillTable(int *t,int n){
    srand(time(NULL));
    int signe=1;
    for(int *p=t;p<t+n;p++){
        *(p)=signe*rand()%n;
        signe*=-1;
    }
}
void mergeTables(int *tab,int l,int m,int r){
    int i,j,k;
    int n1=m-l+1;
    int n2=r-m; 


    int lTab[n1],rTab[n2];

    for(i=0;i<n1;i++){
        lTab[i]=tab[l+i];
    }
    for(i=0;i<n2;i++){
        rTab[i]=tab[m+1+i];
    }

    i=0;j=0;k=l;
    while(i<n1 && j<n2){
        if(lTab[i]<=rTab[j]){
            tab[k]=lTab[i];
            i++;
        }
        else{
            tab[k]=rTab[j];
            j++;
        }
        k++;
    }
    while(i<n1){
        tab[k]=lTab[i];
        i++;
        k++;
    }
    while(j<n2){
        tab[k]=rTab[j];
        j++;
        k++;
    }
}

void diviserTab(int *tab,int l,int r){
    if(r>l){
        int m=(r+l)/2;
        diviserTab(tab,l,m);
        diviserTab(tab,m+1,r);
        mergeTables(tab,l,m,r);
    }
}
void mergeSort(int* t,int n){
        diviserTab(t,0,n-1);
}
double getTime(void(*f)(int*,int),int* t,int n){
    clock_t start,end;
    start=clock();
    f(t,n);
    end=clock();
    return (double)(end-start)/CLOCKS_PER_SEC;
}
如果n=521096

First 10 elements before sorting
18243   -31088  32141   -10616   9312    -356   25619   -26113  23731   -21465

(它只是退出)

您正在堆栈上分配一些大型数组。从您的
mergeTables
功能:

int lTab[n1],rTab[n2];
free(lTab);
free(rTab);
如果要排序的数组很大,
n1
n2
,因此
lTab
rTab
,可能会变大(只有初始数组的一半大小),堆栈通常相当小。如果阵列不匹配,各种奇怪的事情都可能发生。当我用一个大数组(1000万个整数)尝试你的程序时,程序崩溃了

快速排序和冒泡排序通常在原地执行,所以我假设您不需要为它们提供所有这些额外的空间

我将您的两个阵列更改为:

int *lTab = malloc(n1 * sizeof(int));
int *rTab = malloc(n2 * sizeof(int));
然后在函数的末尾:

int lTab[n1],rTab[n2];
free(lTab);
free(rTab);

你来对地方了;)-我的建议是从堆中分配临时表-并且在处理完它们后不要忘记再次释放它们。谢谢你,先生,我不敢相信我没有想到。谢谢托马斯·帕德隆·麦卡锡,这非常有效。