我正在尝试在 C 中实现合并排序算法。我了解该算法应该如何工作,但是我在实现时遇到了一些困难。
我知道它的实现有数百个示例和源代码,但我希望有人能帮助我理解为什么我的工作不正常。
我的代码在下面,在代码之后我解释了我到目前为止所做的尝试。
#include <stdio.h>
void merge(int a[], int L[], int R[],int nL, int nR) //nL and nR are the lengths of L[] and R[]
{
int i = 0 , j = 0, k = 0;
while(i<nL && j <nR)
{
if(L[i] <= R[j]){
a[k] = L[i];
i++;
}
else{
a[k] = R[j];
j++;
}
k++;
}
while(i < nL){
a[k] = L[i];
i++;
k++;
}
while(j < nR) {
a[k] = R[j];
j++;
k++;
}
}
void mergesort(int a[],int n) //n is the length of a[]
{
if(n < 2) return; //BASE CASE
int mid = n / 2;
int left[mid];
int right[n-mid];
for(int i = 0; i < mid; i++)
{
left[i] = a[i];
}
for(int i = mid; i < n-1; i++)
{
right[i-mid] = a[i];
}
int nL = sizeof(left) / sizeof(left[0]);
int nR = sizeof(right) / sizeof(right[0]);
mergesort(left, nL);
mergesort(right, nR);
merge(a,left,right,nL,nR);
}
int main(void)
{
printf("Initial:\n");
printf("3 4 1 6\n");
int numbers[4] = {3,4,1,6};
int n = sizeof(numbers) / sizeof(int);
mergesort(numbers,n);
printf("Sorted:\n");
for(int i =0 ; i < 4; i++)
{
printf("%d ", numbers[i]);
}
return 0;
}
照原样使用未排序的数组[3,4,1,6]
,输出为0 0 1 3
. 显然 1 和 3 相对于彼此的顺序是正确的,但开头的两个零显然是错误的。起初,在我看来,我将 4 和 6 插入到数组的右侧并且超出了数组的范围。
我使用了一些打印语句来尝试调试,但我无法弄清楚发生了什么。我什至尝试使用 gdb 跟踪我的代码,但我仍然无法对其进行排序。
有没有人对可能发生的事情有任何想法?