我试图使用数组里用C实现归并排序,这里是我的代码:合并排序实现不起作用
#include <stdio.h>
#include <stdlib.h>
void merge(int s[], int low, int middle, int high)
{
int i,l=0,r=0;
int left[high/2], right[high/2];
for(i = low; i<=middle; i++) left[i-low] = s[i];
for(i = middle+1; i<=high; i++) right[i-middle-1] = s[i];
i = low;
while(l <= middle-low || r <= high - middle - 1)
{
if(left[l] <= right[r])
{
s[i++] = left[l];
l++;
}
else
{
s[i++] = right[r];
r++;
}
}
while(l <= middle-low)
{
s[i++] = left[l];
l++;
}
while(r <= high - middle - 1)
{
s[i++] = left[r];
r++;
}
}
void mergesort(int s[], int low, int high)
{
int i;
int middle;
if(low < high){
middle = (low + high)/2;
mergesort(s, low, middle);
mergesort(s, middle+1, high);
merge(s, low, middle, high);
}
}
int main()
{
int nums[] = {5, 345, 1, 120, 40, 3450};
int size = (sizeof(nums))/(sizeof(int));
int i;
for(i = 0; i < size; i++)
printf("%d ", nums[i]);
printf("\n");
mergesort(nums, 0, size);
for(i = 0; i < size; i++)
printf("%d ", nums[i]);
printf("\n");
return 0;
}
输出:
5 345 1 120 40 3450
0 1 4 5 40 120
这是一种接近。有人能指出我的错误吗?谢谢。
你的合并函数对'for'循环有可疑的上限,'<='肯定是错误的。 –
乍一看:你的上面的数组边界是独占的,就像C中通常的那样。这意味着所有'<='作为循环条件应该可能只是'<'。当“高”是奇数时,你的右边的子阵列也是一个元素。 –
将所有<=变为<打破代码。现在它打印出什么似乎是随机指针值,还有一个分段错误,我不能用gdb跟踪。 – Antoni4040