无法按Ctrl + D进入EOF

时间:2015-02-24 05:05:36

标签: c arrays sorting pointers mergesort

嗨,我是C的新手,所以仍然对一些事情感到困惑,但到了那里。我试图实施mergesort,我想我已经正确实现了它。

当我编译并运行程序时,它等待我输入。那很好我会给它5 4 3 2 1.然后我按Ctrl + D并没有任何反应。它在终端的开头显示^ D但是没有到达文件的末尾并且将我的排序数组吐出来。不太确定为什么会这样?我试图用printlines调试它,但似乎无法找出原因。这可能与scanf有关吗?感谢。

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

#define ARRAY_MAX 30000

void merge(int *a, int *w, int length){
    int i = 0;
    int j = (length/2);
    int k = 0;

    while ((i < length/2) && (j < length)){
            if (a[i] < a[j]){
                    w[k] = a[i];
                    i++;
                    k++;
            }
            else if (a[j] < a[j]){
                    w[k] = a[j];
                    j++;
                    k++;
            }
    }
    if (i >= length/2){
            for (; j < length; i++){
                    w[k] = a[j];
                    k++;
            }
    }
    else{
            for (; i < length/2; i++){
                    w[k] = a[i];
                    k++;
            }
    }
 }

/*mergesort, requires a workspace*/
void merge_sort(int *a, int *w, int length){

    int i;
    if (length < 2){
            return;
    }
    merge_sort(a, w, length/2);
    merge_sort(a+(length/2), w, (length-(length/2)));

    merge(a,w,length);

    /*copy workspace back to original array*/
    for (i=0; i < length; i++){
            a[i] = w[i];
    }
}

int main(void){
    int my_array[ARRAY_MAX];
    int workspace[ARRAY_MAX];
    clock_t start, end;
    int i;
    int count = 0;

    while ((count < ARRAY_MAX) && (1==scanf("%d", &my_array[count]))){
            count++;
    }

    printf("debug");
    start = clock();
    merge_sort(my_array, workspace, count);
    end = clock();

    for (i=0; i < count; i++){
            printf("%d\n", my_array[i]);
    }

    fprintf(stderr, "%d %f\n", count, (end-start)/(double)CLOCKS_PER_SEC);
    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:3)

这不是Ctrl + D无法解决的问题,而是你的算法。请更改

while ((i < length/2) && (j < length)){
        if (a[i] < a[j]){
                w[k] = a[i];
                i++;
                k++;
        }
        else if (a[j] < a[j]){
                w[k] = a[j];
                j++;
                k++;
        }
}

while ((i < length/2) && (j < length)){
        if (a[i] < a[j]){
                w[k] = a[i];
                i++;
                k++;
        }
        else {
                w[k] = a[j];
                j++;
                k++;
        }
}

由于a[j] < a[j]始终为false,因此它将无限循环。 而且你的mergesort算法也不正确。有关详细信息,请参阅merge_sort的示例代码。