c - (合并排序)代码没有打印任何内容
问题描述
我最近开始用 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++;
}
}
推荐阅读
- mysql - 从mysql表中删除重复值但保留一个
- django - 如何缩小 Django DetailView 导出到 CSV 文件的范围
- javascript - 将导入的样式对象传递给自定义挂钩无法按预期工作
- windows - Windows 应用商店包和预编译头文件
- android - 在Android中调用Activity.setRequestedOrientation(...)时出现黑屏
- java - 如何在不使用拆分、子字符串或索引的情况下在某个字符处剪切字符串?
- c# - 如何使 endDate 的日期仅在 startdate 的日期之后选择 ASP.NET
- python - 将值附加到特定列 openpyxl
- django - django-storages + private S3 bucket - 如何将用户名设为文件夹名称?
- google-cloud-platform - 翻译 API 命令行快速入门失败