C合并排序的实现,如Cormen'所示;s等人;算法简介“;工作不正常
我正试图用C实现这个合并排序伪代码 我想到了这个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
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
而(inotputL[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
(我指的是问题)我会回答,因为这是正确的。