Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 mergeSort中divide部分的无限循环_C_Algorithm_Sorting_Recursion - Fatal编程技术网

C mergeSort中divide部分的无限循环

C mergeSort中divide部分的无限循环,c,algorithm,sorting,recursion,C,Algorithm,Sorting,Recursion,我试图在c中实现merge_sort(递归),但函数myMergesort似乎继续执行除法部分,而从不进入合并部分 我正在使用as伪代码: mergeSort (array A, index i, index f, array X) /* Order A[i..f − 1] using X as auxiliary array */ if more than 1 element then m ← (i + f)/2 mergeSort(A, i, m, X) merge

我试图在c中实现merge_sort(递归),但函数myMergesort似乎继续执行除法部分,而从不进入合并部分

我正在使用as伪代码:

mergeSort (array A, index i, index f, array X)
/* Order A[i..f − 1] using X as auxiliary array */
if more than 1 element then
    m ← (i + f)/2 
    mergeSort(A, i, m, X)
    mergeSort(A, m, f, X) 
    merge(A, i, m, f, X)
我的代码是:

void myMergesort(int a[], int i ,int f,int x[]){
    nloop++;//global variable to count number of iterations
//if I don't do this infinite loop and segmentation fault
    if(nloop>20){
        printf("infinite loop :(\n");
        exit(EXIT_FAILURE);
    }

    if(f>1){
        printArr(a,i,f-1);//prints elements of arr a from i to f-1
        int m = (f+i)/2;
        printf("myMergesort(a,%d,%d,x)\n",i,m);
        myMergesort(a,i,m,x);
        printf("myMergesort(a,%d,%d,x)\n",m,f);
        myMergesort(a,m,f,x);
        merge(a,i,m,f,x);
    }
    else printf("this part of the array already ordered\n");

}
对包含5 1的数组调用mergeSort时,输出为:

myMergesor(a,0,2,x)
5 1 
myMergesor(a,0,1,x)
this part of the array already ordered
myMergesor(a,1,2,x)
1 
myMergesor(a,1,1,x)
this part of the array already ordered
myMergesor(a,1,2,x)
1 
myMergesor(a,1,1,x)
this part of the array already ordered
myMergesor(a,1,2,x)
1 
myMergesor(a,1,1,x)
this part of the array already ordered
myMergesor(a,1,2,x)
1 
myMergesor(a,1,1,x)
this part of the array already ordered
myMergesor(a,1,2,x)
1 
myMergesor(a,1,1,x)
this part of the array already ordered
myMergesor(a,1,2,x)
1 
myMergesor(a,1,1,x)
this part of the array already ordered
myMergesor(a,1,2,x)
1 
myMergesor(a,1,1,x)
infinite loop :(
我确信错误在myMergesort函数中,因为我已经检查过它从未进入合并部分; 但以防万一。。, 我主要是这样说的:

int main(int argc, char *argv[]){
    //input of integers from command line
    int sequenza[argc-1];
    for(int i=1; i<argc; i++){
        sequenza[i-1]=atoi(argv[i]);
    }
    algoMergesort(sequenza,argc-1);
    //print result 
    printArr(sequenza,0,argc-2);
}

void algoMergesort(int a[], int n){
    int x[n];
    printf("myMergesor(a,0,%d,x)\n",n);
    myMergesort(a,0,n,x);
} 
intmain(intargc,char*argv[]){
//从命令行输入整数
int sequenza[argc-1];

对于(int i=1;iif
语句的条件不正确(
f>1

它应该检查从
i
运行到
f
f
排除)的子阵列是否包含多个元素。但是
f
没有给出该大小,它应该是
f-i
,因此将
if
更改为:

if (f-i>1) {