我已经提出了这个
{{1}}
第一组数字是未分类的数字,第二组是数字 排序的,但正如你所看到的,算法没有对它进行排序;我认为问题源于错误地试图将基础1阵列从书中转换为C的基础0,但我并不确定。你能帮我发现问题吗?
提前致谢。
答案 0 :(得分:2)
您的代码存在一些问题,但到目前为止最大的问题是您认为您的算法应该对数组进行排序。事实并非如此。
“merge”函数只是merge-sort的一部分;它的功能是采用两个已经排序的子数组 - A [ p .. q -1]和 A [ q .. r ],我想,如果我正确地解释你的伪代码 - 并将它们合并到一个已经排序的子阵列中 - A [ p .. - [R ]。
因此,为了测试你对该函数的实现,你需要给它一个数组,它的两个部分已经被排序了。
要获得完全排序的数组,您需要完成merge-sort的实现。 (你的书可能要么在你尚未阅读的页面上提供剩余的算法,要么将其设置为练习。)
答案 1 :(得分:0)
您正在混合1索引和0索引。您应该遵循算法所说的内容(1索引),或者只是编写自己的0索引版本。
同时查看错误的大小。我想,你没有将两个排序的数组传递给merge函数。如果仔细考虑,merge
只不过是将排序后的数组放在一起。我想你应该检查一下这些数组是否已经排序。
Infinity不应该被\0
替换。这不符合逻辑。您可以使用INT_MAX
或类似的东西来完成。
首先检查部分程序。首先检查排序功能是否正常。如果它工作,那么去合并。这样您就可以轻松找到问题所在。
示例代码:
int merge(int *arr, int left, int middle, int right)
{
int len1 = middle - left + 1;
int len2 = right - middle;
int arr1[len1];
int arr2[len2];
int i;
for (i=0; i<len1; ++i)
arr1[i] = arr[left + i];
for (i=0; i<len2; ++i)
arr2[i] = arr[middle + 1 + i];
arr1[len1] = INT_MAX;
arr2[len2] = INT_MAX;
int j,k;
j = 0;
i = 0;
for (k=left; k<=right; ++k)
arr[k] = (arr1[i] <= arr2[j])? arr1[i++]:arr2[j++];
return 0;
}
答案 2 :(得分:0)
不要放L[n1]='\0'
和R[n2]='\0'
而是使用此逻辑进行合并
i=0
j=0
k=p
while(i<n1&&j<n2)
{
if(L[i]<=R[j])
{
arr[k]=L[i];
i++;
}
else
{
arr[k]=R[j];
j++;
}
k++;
}
//This following code for copying remaining elements
while(i<n1)
{
arr[k]=L[i];
i++;
k++;
}
while(j<n2)
{
arr[k]=R[j];
j++;
k++;
}