嗨,我是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;
}
答案 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的示例代码。