C合并排序的实现,如Cormen'所示;s等人;算法简介“;工作不正常

C合并排序的实现,如Cormen'所示;s等人;算法简介“;工作不正常,c,algorithm,sorting,merge,mergesort,C,Algorithm,Sorting,Merge,Mergesort,我正试图用C实现这个合并排序伪代码 我想到了这个 int p = 0, r = SEIZE-1, i, j, k; int q = (p + r)/2; int n1 = q-p+1, n2 = r-q; float A[SEIZE] = { 125.6, 67.2, 3.21, 422, 54, 87 }, L[n1], R[n2]; printf("{ "); for( k = 0 ; k < SEIZE ; k++ ){ printf("%.1f ", A[k]); } p

我正试图用C实现这个合并排序伪代码

我想到了这个

int p = 0, r = SEIZE-1, i, j, k;
int q = (p + r)/2;
int n1 = q-p+1, n2 = r-q;
float A[SEIZE] = { 125.6, 67.2, 3.21, 422, 54, 87 }, L[n1], R[n2];

printf("{ ");
for( k = 0 ; k < SEIZE ; k++ ){
    printf("%.1f ", A[k]);
}
printf(" }\n");

for( i = 0 ; i < n1 ; i++ ){
    L[i] = A[p+i];
}
for( j = 0 ; j < n2 ; j++ ){
    R[j] = A[q+j+1];
}
L[n1] = '\0';
R[n2] = '\0';

i = 0;
j = 0;

for( k = p ; k <= r; k++ ){
    if( L[i] <= R[j] ){
        A[k] = L[i];
        i = i+1;
    }
    else{
        A[k] = R[j];
        j = j+1;
    }
}

printf("{ ");
for( k = 0 ; k < SEIZE ; k++ ){
    printf("%.1f ", A[k]);
}
printf(" }\n");
int p=0,r=1,i,j,k;
int q=(p+r)/2;
int n1=q-p+1,n2=r-q;
浮点数A[capture]={125.6,67.2,3.21422,54,87},L[n1],R[n2];
printf(“{”);
对于(k=0;k对于(k=p;k,您的代码存在一些问题,但到目前为止,最大的问题是您认为您的算法应该对数组进行排序,而事实并非如此

“merge”函数只是merge sort的一部分;它的功能是获取两个已经排序的子数组-A[p..q−1] 我想,如果我正确地解释你的伪代码,并将它们合并到一个已经排序的子数组中,A[q..r],A[p..r]

因此,为了测试该函数的实现,需要给它一个数组,该数组的两部分已经排序


为了得到一个完全排序的数组,您需要完成合并排序的实现(您的书可能会在您尚未阅读的页面上提供算法的其余部分,或者将其设置为练习)

您的代码存在一些问题,但到目前为止,最大的问题是您认为您的算法应该对数组进行排序,而事实并非如此

“merge”函数只是merge sort的一部分;它的功能是获取两个已经排序的子数组-A[p..q−1] 我想,如果我正确地解释你的伪代码,并将它们合并到一个已经排序的子数组中,A[q..r],A[p..r]

因此,为了测试该函数的实现,需要给它一个数组,该数组的两部分已经排序

要获得完全排序的数组,您需要完成合并排序的实现。(您的书可能会在您尚未阅读的页面上为您提供算法的其余部分,或者将其设置为练习。)

  • 你把1-索引和0-索引混在一起了。你应该遵循算法所说的(1-索引),或者你可以编写自己版本的0-索引

  • >p>还查看错误的大小。我认为,您没有将两个排序的数组传递给合并函数。如果仔细考虑,<代码>合并< /代码>只不过是将排序后的数组按顺序排列在一起。我猜您应该检查这些数组是否排序。

  • 不应将无穷大替换为
    \0
    。这不符合逻辑。可以使用
    INT\u 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;
}
int合并(int*arr,int左,int中,int右)
{
int len1=中间-左+1;
int len2=右-中;
int-arr1[len1];
int-arr2[len2];
int i;
对于(i=0;i
  • 你把1-索引和0-索引混在一起了。你应该遵循算法所说的(1-索引),或者你可以编写自己版本的0-索引

  • >p>还查看错误的大小。我认为,您没有将两个排序的数组传递给合并函数。如果仔细考虑,<代码>合并< /代码>只不过是将排序后的数组按顺序排列在一起。我猜您应该检查这些数组是否排序。

  • 不应将无穷大替换为
    \0
    。这不符合逻辑。可以使用
    INT\u 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;
}
int合并(int*arr,int左,int中,int右)
{
int len1=中间-左+1;
int len2=右-中;
int-arr1[len1];
int-arr2[len2];
int i;

对于(i=0;i不要把
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++;
}
i=0
j=0
k=p

而(inotput
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++;
}
i=0
j=0
k=p

while(你能发布完整的代码吗?你能发布完整的代码吗?是的。是的。我不知道OP怎么这么肯定问题就出在这里……不管怎样,这打破了
MCVE
(我是说这个问题)。我会坚持到底。是的。是的。是的。我不知道OP怎么这么肯定问题就出在这里……不管怎样,这打破了
MCVE
(我指的是问题)我会回答,因为这是正确的。