我正在尝试重新编写递归合并排序,例如
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
功能)。
提前致谢。