Почему мой базовый вариант (ошибочно) запускается немедленно?

Я пытаюсь реализовать алгоритм сортировки слиянием на языке C. В рекурсивной функции разделения массива мой базовый случай происходит бесконечно, несмотря на оператор return, а функция слияния никогда не вызывается. Вот мой код:

#include <stdio.h>

const int MAX = 1000;

int getArray(int unsorted[MAX], int upperBound)
{
    int i;
    for(i = 0; i <= upperBound; ++i)
    {
        printf("Now enter integer number %d: ", i + 1);
        scanf("%d", &unsorted[i]);
        while((getchar()) != '\n');
    }   
    printf("\n");
    return 0;
}

int merge(int unsorted[MAX], int sorted[1000], int lowerLeft, int lowerRight)
{
    if(lowerLeft == lowerRight)
        return 0;
    int j = lowerRight;
    for(int i = lowerLeft; i < lowerRight; ++i)
    {
        if(unsorted[i] <= unsorted[j])
        {
            sorted[i] = unsorted[i];
            ++j;
        }
        else
        {
            sorted[i] = unsorted[j];
            ++j;
        }
    }
    return 1;
}

int split(int unsorted[MAX], int sorted[1000], int lowerBound, int upperBound)
{
    printf("%d is the lBound and %d is the uBound\n", lowerBound, upperBound);
    if(lowerBound == upperBound)
    {
        printf("\nBase case triggered.");
        getchar();
        return 0;
    }
    int middle = upperBound/2;
    split(unsorted, sorted, 0, middle);
    split(unsorted, sorted, middle + 1, upperBound);    
    merge(unsorted, sorted, lowerBound, middle);
    return 1;
}

int main()
{
    int unsorted[MAX];
    int sorted[MAX];
    int lowerBound = 0;
    int upperBound;

    printf("First enter the number of integers you wish to sort: ");
    scanf("%d", &upperBound);
    while((getchar()) != '\n');
    printf("\n");
    upperBound = upperBound - 1;
    getArray(unsorted, upperBound);
    split(unsorted, sorted, lowerBound, upperBound);
    printf("\n");
    for(int c = 0; c < upperBound; ++c)
    {
        printf("%d, ", sorted[c]);
    }

    return 0;
}

Почему после достижения базового случая функция слияния не вызывается? Извините, если я не сформулировал вопрос удобно, надеюсь, что кто-то может мне помочь, спасибо.

1 ответ

Ваш базовый случай запускается, потому что так работают рекурсивные алгоритмы. Ты продолжаешь звонитьsplit()снова и снова с нижним и нижним промежутком между lowerBound и upperBound, так что в конечном итоге срабатывает ваш базовый случай. И это должно быть хорошо, поскольку запуск базового случая позволяет вам знать, что ваши входные "массивы" (синглтоны) отсортированы и могут быть объединены.

Причина, по которой он запускается "немедленно", заключается в том, что он должен: split() вызывается постоянно, пока не будет выполнен базовый вариант, поэтому первый оператор печати, который вы увидите, является оператором базового случая.

Другие вопросы по тегам