【问题标题】:infinite loop in divide part in mergeSort合并排序中除法部分的无限循环
【发布时间】:2018-05-02 08:39:02
【问题描述】:

我正在尝试在 c 中实现 merge_sort(recursive),但函数 myMergesort 似乎继续执行除法部分并且永远不会进入合并部分

我使用的是伪代码:

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 函数中,因为我检查过它从未进入合并部分; 但以防万一.., 我在 main 中这样称呼它:

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);
} 

提前谢谢你

【问题讨论】:

    标签: c algorithm sorting recursion


    【解决方案1】:

    if 语句的条件不正确 (f&gt;1)。

    它应该检查从if(不包括f)的子数组是否包含多个元素。但是f没有给你那个尺寸,应该是f-i,所以把if改成:

    if (f-i>1) {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-16
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多