MergeSort и Merge C ++ - PullRequest
       52

MergeSort и Merge C ++

0 голосов
/ 22 сентября 2019

Возникла проблема с моими MergeSort() и Merge() в моей домашней работе для школы.Я новичок в C ++ (я не учился в школе два года, они изменили мою специальность с новыми классами. Я изучал Java ...) Короче говоря, мои функции Merge() и MergeSort() не работаютв VS Code, когда я их отлаживаю.У меня проблемы с функцией, работающей в целом.Я не знаю, правильно ли я передаю параметры.

Я пытался изменить функцию Merge(), подняв ее выше MergeSort().

void Merge(int B[], int &lStart, int &lEnd, int &rStart, int &rEnd) {
    int length;
    int temp[length];
    int theSaved = lStart;
    int i = lStart;

    while (lStart < lEnd && rStart <= rEnd) {
        if (B[lStart] < B[rStart]) {
            temp[i++] = B[lStart++];
        }

        else {
            temp[i++] = B[rStart++];
        }
    }

    while (lStart <= lEnd) {
        temp[i++] = B[lStart++];
    }

    while (rStart <= rEnd) {
        temp[i++] = B[rStart++];
    }

    for (int j = theSaved; j < rEnd; j++) {
        B[j] = temp[j];
    }
}

void MergeSort(int B[], int start, int end) {
    int middle;
    int theMiddle = middle + 1;
    if (start < end) {
        middle = (start + end) / 2;
        MergeSort(B, start, middle);
        MergeSort(B, middle + 1, end);
        Merge(B, start, middle, theMiddle, end);
    }
}

int main() {
    int length = 7;
    int begin = 0;
    int end = (length - 1);
    int B[length] = {10, 50, 90, 60, 5, 20, 40};

    for (int i = 0; i < length; i++) {
        MergeSort(B, begin, end);
        cout << "\n" << B[i];
    }
    return 0;
}

Я просто хотел понять, что происходит.Я пытался сделать это логически, но это оказалось слишком запутанным.Выход должен быть 5,10,20,40,50,60,90

1 Ответ

0 голосов
/ 24 сентября 2019

merge () не должен принимать параметры по ссылке, используйте int lStart вместо int & lStart.rStart всегда будет lEnd + 1, поэтому для слияния необходимы только 3 параметра.Если в слиянии должно быть lStart <= lEnd. </p>

Хотя это и не проблема, код будет немного проще, если начальный вызов main будет MergeSort (B, 0, length).Тогда Merge может быть вызван с (B, начало, середина, конец).Цикл в merge () будет иметь ... lStart

...