(Сортировка слиянием) Код ничего не печатает - PullRequest
1 голос
/ 03 августа 2020

Недавно я начал изучать алгоритм с 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++;
    }
}

1 Ответ

0 голосов
/ 03 августа 2020

Вы не можете вычислить размер массивов, переданных в качестве параметров с помощью 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++;
    }
}
...