我正在尝试实现合并排序,但我无法让它工作。如果有人能找到并指出我思考(和代码)中的错误,我将非常感激 主要功能没有不必要的代码:
int main(int argc, char *argv[]) {
int n = 0;
std::cin >> n;
int num[n];
for(int i = 0; i < n; i++) {
std::cin >> num[i];
}
sort(num, &num[n - 1], n);
return(0);
}
合并排序功能:
int *sort(int *s, int *e, int size) {
if(s == e) {
return(s);
}
int mid = (size + 1) / 2;
//split array recursively to 1-element arrays
int *left = sort(s, (s + mid - 1), mid);
int *right = sort(s + mid, e, size - mid);
int *counter = s;
//merge arrays back together
while(left < (s + mid - 1) && right <= e) {
//std::cout << *left << " " << *right << std::endl;
for(; left < (s + mid - 1) && *left <= *right; left++, counter++) {
*counter = *left;
}
for(; right <= e && *right <= *left; right++, counter++) {
*counter = *right;
}
}
for(; left < (s + mid - 1); left++, counter++) {
*counter = *left;
}
for(; right <= e; right++, counter++) {
*counter = *right;
}
return(s);
}
INPUT0:
5
4 3 2 1 0
OUTPUT0:
0 0 0 0 0INPUT1:
5
0 1 2 3 4
输出1:
1 2 4 4 4输入2:
2
0 1
输出2:
1 1
答案 0 :(得分:2)
看起来你正在复制一个值而不保存原始值(并用它做一些事情):
*counter = *left;
答案 1 :(得分:2)
您的问题似乎在*counter = *left
和*counter = *right
。算法的常规实现使用单独的数组来创建新的合并数组。但在这种情况下,您正在合并它inplace
。当您*counter = *left
该值丢失时,这可能会导致您在示例运行中看到的所有零。
当你合并时,你可以用两种方式做到。创建一个临时数组并继续写入它而不是*counter
并在耗尽两个数组的所有元素后使用临时数组重新填充实际数组,或者在数组大小为合并小于预定义值。
这两种方法都详细给出 http://en.literateprograms.org/Merge_sort_%28C%29
PS:我还认为您应该在所有地方将条件left < (s + mid - 1)
更改为left <=(s + mid -1)
。