Возникли проблемы, которые Mergesort сравнивает и упорядочивает (c ++)

Если ваше имя файла отличается от имени класса, которое содержит основной метод, возможно, это может быть причиной этой ошибки.

1
задан joasdf 17 March 2019 в 22:16
поделиться

3 ответа

Проверка того, что один из массивов исчерпал себя, а другой массив имеет оставшиеся элементы, должна быть вне основного цикла while. Итак, попробуйте выставить два следующих чека наружу.

else if (left.size() <= 0 && right.size() > 0)    

else if (right.size() <= 0 && left.size() > 0)

Подумайте, что произойдет, когда один массив имеет (1), а другой (2,3). При добавлении 1 к отсортированному вектору условие while(left.size() > 0 && right.size() > 0) ложно, и цикл прерывается. Таким образом, другие элементы игнорируются.

0
ответ дан Msk 17 March 2019 в 22:16
поделиться

Код можно упростить:

vector<int> sortit(vector<int> &left, vector<int> &right) {
    vector<int> sorted(left.size() + right.size());
    int i = 0;
    while (1) {
        if (left.at(0) <= right.at(0)) {
            sorted.at(i++) = left.at(0);
            left.erase(left.begin());
            if(left.size == 0){
                do{
                    sorted.at(i++) = right.at(0);
                    right.erase(right.begin());
                }while(right.size != 0);
                return;
            }
        } else {
            sorted.at(i++) = right.at(0);
            right.erase(right.begin());
            if(right.size == 0){
                do{
                    sorted.at(i++) = left.at(0);
                    left.erase(left.begin());
                }while(left.size != 0);
                return;
            }
        }
    }
    return sorted;
}

вместо стирания элементов векторов можно использовать индексацию:

vector<int> sortit(vector<int> &left, vector<int> &right) {
    vector<int> sorted(left.size() + right.size());
    int i = 0;
    int ll = 0;
    int rr = 0;
    while (1) {
        if (left[ll] <= right[rr]) {
            sorted[i++] = left[ll++];
            if(ll == left.size){
                do{
                    sorted[i++] = right[rr++];
                }while(rr != right.size);
                break;
            }
        } else {
            sorted[i++] = right[rr++];
            if(rr == right.size){
                do{
                    sorted[i++] = left[ll++];
                }while(ll != left.size);
                break;
            }
        }
    }
    return sorted;
}
0
ответ дан rcgldr 17 March 2019 в 22:16
поделиться

не знает, как вызывать [] часть сравнения и упорядочения

Условно: merge

извините за длинный код

используйте

first = *left <= *right ? left : right

и манипулируйте этим, избегая репликации кода.

не видите, почему последний элемент игнорируется кодом?

left.at(0) <= right.at(0)

и

right.at(0) <= left.at(0)

охватывают все возможные результаты сравнения (равенство дважды): дальнейшая оценка else не будет выполнена.
Перемещая «движущиеся части», следуя «правильному слиянию», как предложено , отметьте, что предварительные проверки не требуются - просто используйте «петли перемещения».


Многое можно сказать о вашем коде (начиная с комментирования) - см. обзоры кода реализации слияний в C ++ для идей.
Если вы хотите, чтобы код, который вы контролируете, был рассмотрен в CR @ SE, обязательно укажите по теме и , чтобы написать хороший вопрос .

0
ответ дан greybeard 17 March 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: