首页 > 解决方案 > (合并排序)代码没有打印任何内容

问题描述

我最近开始用 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++;
    }
}

标签: cmergesort

解决方案


您无法计算作为参数传递的数组的大小,int nl = sizeof(l) / sizeof(l[0]);因为sizeof(l)是指向 的指针的大小int,而不是数组的大小。 sizeof(l)仅当数组的定义在范围内时才计算数组的大小。

您应该将尺寸明确地作为参数传递。

还要改变计算midint 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++;
    }
}

推荐阅读