我最近在没有碰过它一段时间后再次开始刷我的C.所以,我开始尝试实现合并排序,但在查看这些行大约一个小时后,我无法确定错误。
int main(int argc,char** argv){
printf("test\n");
int x;
int input[] = {1,2,3};
int start=0;
int end=2;
for (x=0;x<5;x++){
//printf("%i\n",x);
}
printf("Run mergeSort in main \n");
mergeSort(input,start,end);
}
void mergeSort(int input[], int start, int end){
printf("Running merge %i %i",start,end);
int middle = (start + end)/2;
if (start < end){
mergeSort(input,start,middle);
mergeSort(input,middle+1,end);
merge(input,start,middle,end);
}
}
当我运行这个程序时,第一行“test”将打印然后“在main中运行合并排序”但是
printf("Running merge %i %i",start,end);
没有被执行,这让我感到困惑。我找不到任何内存分配问题,或者我错过了一些非常明显的内容。
请注意,合并函数已在侧面实现,但该部分代码与此问题无关,因此我没有将其包含在内。
编辑剩余代码:
void merge(int input[],int start, int middle, int end){
int save_start = start;
int temp[end-start+1];
int index = 0;
printf("Start merge");
while (start<=middle || middle+1<=end){
if (input[start]<input[middle]){
temp[index] = input[start];
start++;
} else {
temp[index] = input[middle];
middle++;
}
index++;
}
while (start<=middle){
temp[index] = input[start];
start++;
}
while (middle+1<=end){
temp[index] = input[middle];
middle++;
}
int i=0;
int a;
for (a=save_start;i<index;a++,i++){
input[a]=temp[i];
}
}
答案 0 :(得分:1)
您的输出很可能是缓冲的,只是等待打印。在该字符串中添加\n
或致电fflush(stdout)
。
就您的分段错误而言,您没有向我们展示足够的代码。使用调试器获取回溯,您可能会发现更多信息。
编辑:您的merge
函数中存在一些数组索引错误。请注意,您在第一个循环中移动中间 - 这对循环条件有什么影响?提示:您需要停在实际中间位置,而不是在start
超过该点时继续前进。
编辑2:你也有一些一对一的错误。
编辑3:您的||
应为&&
。
答案 1 :(得分:1)
我相信你的错误就在这里:while (start<=middle || middle+1<=end)
。
start<=middle || middle+1<=end
为真:start<=middle
或middle+1<=end
,导致您的代码在该循环中读取和写出数组的范围。
start<=middle && middle+1<=end
为真:start<=middle
和middle+1<=end
,导致循环中断,否则它可能会读取和写出数组的边界。
您可能意味着while (start<=middle && middle+1<=end)
。