(合并排序)代码没有打印
(Merge sort) The code is printing nothing
我最近开始用C学习算法。我尝试实现merge_sort
。但是代码没有打印任何内容,我找不到发生这种情况的问题。如果您查看代码并给我解决方案,那将对我非常有帮助。提前致谢。
注意:这里我没有给出main
功能。只有 merge_sort()
和 merge()
函数
#include <stdio.h>
void merge(int a[], int l[], int r[]);
void merge_sort(int a[], int n) {
if (n < 2) {
return;
} else {
int i;
int mid = (n - 1) / 2;
int l[mid], r[n - mid];
for (i = 0; i < mid; i++) {
l[i] = a[i];
}
for (i = mid; i < n; i++) {
r[i - mid] = a[i];
}
merge_sort(l, mid);
merge_sort(r, n - mid);
merge(a, l, r);
}
}
void merge(int a[], int l[], int r[]) {
int i = 0;
int j = 0;
int k = 0;
int nl = sizeof(l) / sizeof(l[0]);
int nr = sizeof(r) / sizeof(r[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++;
}
}
您无法计算使用 int nl = sizeof(l) / sizeof(l[0]);
作为参数传递的数组的大小,因为 sizeof(l)
是指向 int
的指针的大小,而不是数组的大小。 sizeof(l)
仅当数组定义在范围内时计算数组的大小。
您应该明确地将尺寸作为参数传递。
同时更改 mid
的计算:int mid = n / 2;
这是修改后的版本:
#include <stdio.h>
void merge(int a[], int l[], int nl, int r[], int nr);
void merge_sort(int a[], int n) {
if (n < 2) {
return;
} else {
int i;
int mid = n / 2;
int l[mid], r[n - mid];
for (i = 0; i < mid; i++) {
l[i] = a[i];
}
for (i = mid; i < n; i++) {
r[i - mid] = a[i];
}
merge_sort(l, mid);
merge_sort(r, n - mid);
merge(a, l, mid, r, n - mid);
}
}
void merge(int a[], int l[], int nl, int r[], int nr) {
int i = 0;
int j = 0;
int 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++;
}
}
我最近开始用C学习算法。我尝试实现merge_sort
。但是代码没有打印任何内容,我找不到发生这种情况的问题。如果您查看代码并给我解决方案,那将对我非常有帮助。提前致谢。
注意:这里我没有给出main
功能。只有 merge_sort()
和 merge()
函数
#include <stdio.h>
void merge(int a[], int l[], int r[]);
void merge_sort(int a[], int n) {
if (n < 2) {
return;
} else {
int i;
int mid = (n - 1) / 2;
int l[mid], r[n - mid];
for (i = 0; i < mid; i++) {
l[i] = a[i];
}
for (i = mid; i < n; i++) {
r[i - mid] = a[i];
}
merge_sort(l, mid);
merge_sort(r, n - mid);
merge(a, l, r);
}
}
void merge(int a[], int l[], int r[]) {
int i = 0;
int j = 0;
int k = 0;
int nl = sizeof(l) / sizeof(l[0]);
int nr = sizeof(r) / sizeof(r[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++;
}
}
您无法计算使用 int nl = sizeof(l) / sizeof(l[0]);
作为参数传递的数组的大小,因为 sizeof(l)
是指向 int
的指针的大小,而不是数组的大小。 sizeof(l)
仅当数组定义在范围内时计算数组的大小。
您应该明确地将尺寸作为参数传递。
同时更改 mid
的计算:int mid = n / 2;
这是修改后的版本:
#include <stdio.h>
void merge(int a[], int l[], int nl, int r[], int nr);
void merge_sort(int a[], int n) {
if (n < 2) {
return;
} else {
int i;
int mid = n / 2;
int l[mid], r[n - mid];
for (i = 0; i < mid; i++) {
l[i] = a[i];
}
for (i = mid; i < n; i++) {
r[i - mid] = a[i];
}
merge_sort(l, mid);
merge_sort(r, n - mid);
merge(a, l, mid, r, n - mid);
}
}
void merge(int a[], int l[], int nl, int r[], int nr) {
int i = 0;
int j = 0;
int 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++;
}
}