尝试在 C 中设置归并排序递归函数,我想出了以下内容。
奇怪的行为是,当数组的大小很小(大约 10)时,它工作得非常好。对于从 10 到 15 的大小,它有时会错误排序(一两个值会随机放置在最终数组中),对于大于 15 的值,它总是会错误排序一两个值,并将一两个整数值替换为非常大的负整数。
例如,这个数组:[3] [9] [2] [11] [8] [7] [5] [2]
像这样排序:[2] [2] [3] [-254587859] [7] [8] [11]
--
这是我想出的代码:
主要的() :
int main(int ac, char **av)
{
int size = atoi(av[1]);
int *array = malloc(size*sizeof(int));
int i;
for (i = 0; i < size; i++) { array[i] = rand() % size; }
merge_sort(array, 0, size-1);
print_array(array, size);
free(array);
return 0;
}
合并排序():
void merge_sort(int array[], int beg, int end)
{
int mid = (end + beg) / 2;
if (beg < end)
{
merge_sort(array, beg, mid);
merge_sort(array, mid+1, end);
merge(array, beg, mid, end);
}
return;
}
合并():
void merge(int array[], int beg, int mid, int end)
{
int size_left = mid - beg + 1;
int size_right = end - mid;
int *left = malloc((size_left)*sizeof(int));
int *right = malloc((size_right)*sizeof(int));
int i,j,k;
for (i = 0; i < size_left; i++) { left[i] = array[beg+i]; }
for (j = 0; j < size_right; j++) { right[j] = array[mid+1+j]; }
i = 0; j = 0; for (k = beg; k <= end; k++) { array[k] = (left[i] <= right[j]) ? left[i++] : right[j++]; }
free(left); free(right);
return;
}
我想这是一个内存分配问题,我可以分配大量内存(我试过了,它有效)但这不是重点。你知道那里发生了什么吗?
配置:gcc 4.6.2,Windows 7 64 位。