【发布时间】:2014-03-03 01:05:32
【问题描述】:
在尝试在 C 中构建归并排序作为练习时,我遇到了一个奇怪的问题,即算法的输出会随着 printf 的存在而变化。让我进一步详细说明。我有一个“MergeSort.h”文件,其中我的合并排序算法如下:
#ifndef _MSORT_H_
#define _MSORT_H_
void merge(int a[],int lo,int mi,int hi){
int n1 = (mi - lo) +1;
int n2 = hi - mi;
int left[n1];
int right[n2];
int i;
int j;
int k;
for(i = 0;i < n1;i++){
left[i] = a[lo+i];
}
for(j = 0;j < n2;j++){
right[j] = a[mi+j+1];
}
i = 0;
j = 0;
for(k = lo;k <= hi;k++){
if(left[i] < right[j]){
a[k] = left[i];
i = i + 1;
}else{
a[k] = right[j];
j = j+1;
}
}
}
void msorthelper(int a[],int p,int r){
if(p < r){
int mid = (p + r)/2;
msorthelper(a,0,mid);
msorthelper(a,mid+1,r);
merge(a,p,mid,r);
}
}
void msortex(int a[],int size){
msorthelper(a,0,size-1);
int counter;
for(counter = 0;counter < size;counter++){
printf(" %d ",a[counter]);
}
}
#endif
我在 sorttester.c 中有对应的排序测试器:
#include <stdio.h>
#include "mergesort.h"
int main(){
int out[] = {8,1,6};
msortex(out,3);
}
运行 sorttester 的输出如下:
1 0 0
现在有趣的部分是,当我将任何 printf 语句放在合并的开头时,会生成正确的输出。这是一个例子:
#ifndef _MSORT_H_
#define _MSORT_H_
void merge(int a[],int lo,int mi,int hi){
printf("Hello\n");
int n1 = (mi - lo) +1;
int n2 = hi - mi;
int left[n1];
int right[n2];
.................Rest of the code.....
现在的输出是:
你好你好 1 6 8
这是数组 8 6 1 的正确排序顺序。
有人能告诉我我在这里可能做错了什么,导致输出因 printf 的存在而急剧下降吗?
谢谢
【问题讨论】:
标签: c debugging printf output mergesort