合并排序的C实现,如Cormen& s等人的"算法简介"不正常

时间:2017-11-07 01:42:21

标签: c algorithm sorting merge mergesort

我尝试使用C实现此合并排序伪代码enter image description here

我已经提出了这个

{{1}}

然而,这发生了enter image description here

第一组数字是未分类的数字,第二组是数字 排序的,但正如你所看到的,算法没有对它进行排序;我认为问题源于错误地试图将基础1阵列从书中转换为C的基础0,但我并不确定。你能帮我发现问题吗?

提前致谢。

3 个答案:

答案 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++;
}