C 中的合并排序算法无法正常工作
Merge Sort Algorithm in C not working properly
我正在尝试在 C 中实现合并排序算法。我了解算法和逻辑应该如何运行,但是我在直接实现时遇到了一些困难。
我知道网上有很多合并排序的例子,我也看过一些 Whosebug 的帖子来解决类似的问题。但是,我希望有人能帮助我理解为什么我的代码似乎 运行 不正确。
我的代码如下:
#include <stdio.h>
#include <stdlib.h>
// Function to Merge Arrays L and R into A
// leftCount = number of elements in L
// rightCount = number of elements in R
void Merge(int *A,int *L,int leftCount, int *R, int rightCount)
{
// i, to mark the index of subarray (L)
// j, to mark the index of subarray (R)
// k, to mark the index of subarray (A)
int i = 0;
int j = 0;
int k = 0;
while(i<leftCount && j<rightCount)
{
if(L[i] <= R[j])
{
A[k++] = L[i++];
}
else
{
A[k++] = R[j++];
}
}
while(i<leftCount)
{
A[k++] = L[i++];
}
while(j<rightCount)
{
A[k++] = R[j++];
}
}
// Recursive function to sort an array of integers
void MergeSort(int *A, int n)
{
int i;
int mid;
int *L;
int *R;
if (n<2) // Base condition
{
return;
}
mid = n/2; // Find the mid index
L = (int*)malloc(mid*sizeof(int));
R = (int*)malloc((n-mid)*sizeof(int));
for(i=0;i<mid;i++) // Creating left subarray
{
L[i] = A[i];
}
for(i=mid;i<n;i++) // Creating right subarray
{
R[i-mid] = A[i];
}
MergeSort(L,mid);
MergeSort(R,n-mid);
Merge(A,L,R,mid,n-mid);
free(L);
free(R);
}
int main()
{
int A[] = {2,4,1,6,8,5,3,7};
int i;
int numberofelements;
numberofelements = sizeof(A)/sizeof(A[0]);
MergeSort(A,8);
for(int i = 0; i<8; i++)
{
printf("%d ",A[i]);
return 0;
}
}
在我 运行 这段代码之后,我似乎只得到了“1”的输出,而不是排序数组。我真的希望有人能帮助我。
您的 Merge()
签名与您调用它的方式不匹配:
签名:
void Merge(int *A,int *L,int leftCount, int *R, int rightCount)
调用:
Merge(A,L,R,mid,n-mid);
当您将指针 (R
) 解析为整数 (leftCount
) 并将整数 (mid
) 解析为指针时,这会导致未定义的行为(R
).
很确定你的编译器会给你一个警告,确保你打开警告,你的编译器通常知道他在说什么:)
让自己习惯使用 -Wall
进行编译(如果您使用的是 gcc)。如果您这样做,您会发现您使用错误的参数调用了 Merge()
。应该是:
Merge(A,L,mid,R,n-mid);
此外,您不应该 return 从打印数组元素的循环内部。这就是为什么你只看到 1
。仔细看代码:循环体return无条件来自main()
,所以只会执行一次。将 return
移出循环:
for(i = 0; i<8; i++)
{
printf("%d ",A[i]);
}
return 0;
我正在尝试在 C 中实现合并排序算法。我了解算法和逻辑应该如何运行,但是我在直接实现时遇到了一些困难。
我知道网上有很多合并排序的例子,我也看过一些 Whosebug 的帖子来解决类似的问题。但是,我希望有人能帮助我理解为什么我的代码似乎 运行 不正确。
我的代码如下:
#include <stdio.h>
#include <stdlib.h>
// Function to Merge Arrays L and R into A
// leftCount = number of elements in L
// rightCount = number of elements in R
void Merge(int *A,int *L,int leftCount, int *R, int rightCount)
{
// i, to mark the index of subarray (L)
// j, to mark the index of subarray (R)
// k, to mark the index of subarray (A)
int i = 0;
int j = 0;
int k = 0;
while(i<leftCount && j<rightCount)
{
if(L[i] <= R[j])
{
A[k++] = L[i++];
}
else
{
A[k++] = R[j++];
}
}
while(i<leftCount)
{
A[k++] = L[i++];
}
while(j<rightCount)
{
A[k++] = R[j++];
}
}
// Recursive function to sort an array of integers
void MergeSort(int *A, int n)
{
int i;
int mid;
int *L;
int *R;
if (n<2) // Base condition
{
return;
}
mid = n/2; // Find the mid index
L = (int*)malloc(mid*sizeof(int));
R = (int*)malloc((n-mid)*sizeof(int));
for(i=0;i<mid;i++) // Creating left subarray
{
L[i] = A[i];
}
for(i=mid;i<n;i++) // Creating right subarray
{
R[i-mid] = A[i];
}
MergeSort(L,mid);
MergeSort(R,n-mid);
Merge(A,L,R,mid,n-mid);
free(L);
free(R);
}
int main()
{
int A[] = {2,4,1,6,8,5,3,7};
int i;
int numberofelements;
numberofelements = sizeof(A)/sizeof(A[0]);
MergeSort(A,8);
for(int i = 0; i<8; i++)
{
printf("%d ",A[i]);
return 0;
}
}
在我 运行 这段代码之后,我似乎只得到了“1”的输出,而不是排序数组。我真的希望有人能帮助我。
您的 Merge()
签名与您调用它的方式不匹配:
签名:
void Merge(int *A,int *L,int leftCount, int *R, int rightCount)
调用:
Merge(A,L,R,mid,n-mid);
当您将指针 (R
) 解析为整数 (leftCount
) 并将整数 (mid
) 解析为指针时,这会导致未定义的行为(R
).
很确定你的编译器会给你一个警告,确保你打开警告,你的编译器通常知道他在说什么:)
让自己习惯使用 -Wall
进行编译(如果您使用的是 gcc)。如果您这样做,您会发现您使用错误的参数调用了 Merge()
。应该是:
Merge(A,L,mid,R,n-mid);
此外,您不应该 return 从打印数组元素的循环内部。这就是为什么你只看到 1
。仔细看代码:循环体return无条件来自main()
,所以只会执行一次。将 return
移出循环:
for(i = 0; i<8; i++)
{
printf("%d ",A[i]);
}
return 0;