我正在尝试重写一个像
这样的递归合并排序void MergeSort(int* data, int size){
int half=size/2;
if (size > 1) {
MergeSort(data, half);
MergeSort(data+half, half);
Merge(data, size);
}
}
其中
void Merge(int* data, int size){
int cnt;
int cntLow=0;
int half=size/2;
int cntHigh=half;
int* sorted;
sorted = (int*) malloc(size*sizeof(int));
for (cnt=0; cnt<size; cnt++){
if (cntLow == half)
sorted[cnt] = data[cntHigh++];
else if (cntHigh == size)
sorted[cnt] = data[cntLow++];
else if (data[cntLow] <= data[cntHigh])
sorted[cnt] = data[cntLow++];
else
sorted[cnt] = data[cntHigh++];
}
for (cnt=0; cnt<size; cnt++)
data[cnt] = sorted[cnt];
free(sorted);
}
到非递归调用。所以我写了函数
void MergeSort_NonRecursive(int* data, int size){
int i;
int j;
for (i=size; i>0; i=i/2){
for (j=0; j<i; j++){
Merge(data + j*size/i, size/i);
}
}
}
显然适用于大小为$ 2 ^ n $的序列。但是,当我以大于$ 2 ^ n $的大小的顺序运行它时,它并不正确,所以在MergeSort_NonRecursive
的某些点,我的代码我一定是错的。
那我在哪里做错了(MergeSort_NonRecursive
)? (另外,我需要使用Merge
功能)。
提前致谢。
答案 0 :(得分:3)
由于size是int,size / 2会截断你的商。
e.g。如果size = 4,size / 2 = 2.如果size = 5,size / 2 = 2.如果size = 6,size / 2 = 3.
因此,对于大小为5,您希望对size / 2元素(即前3个)进行第一次MergeSort递归调用,然后对剩余的2个元素进行第二次调用。
你可以说例如。
int half = size/2; //size = 5: half = 2
int rest = size - half; //rest = 3
这样:
void MergeSort(int* data, int size){
int half=size/2;
int rest = size-half;
if (size > 1) {
MergeSort(data, half);
MergeSort(data+half, rest); //changed this line
Merge(data, size);
}
}
我发布后,看起来你稍微改了一下这个问题。一般的想法仍然存在:当你将int除以另一个int时,商被截断。
在您的MergeSort_NonRecursive
中,您要在多个地方划分int
,例如i=i/2
,j*size/i
,size/i
。注意你会得到的价值。