Если ваше имя файла отличается от имени класса, которое содержит основной метод, возможно, это может быть причиной этой ошибки.
Проверка того, что один из массивов исчерпал себя, а другой массив имеет оставшиеся элементы, должна быть вне основного цикла 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)
ложно, и цикл прерывается. Таким образом, другие элементы игнорируются.
Код можно упростить:
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;
}
не знает, как вызывать [] часть сравнения и упорядочения
blockquote>Условно: merge
извините за длинный код
blockquote>используйте
first = *left <= *right ? left : right
и манипулируйте этим, избегая репликации кода.
не видите, почему последний элемент игнорируется кодом?
blockquote>left.at(0) <= right.at(0)
и
right.at(0) <= left.at(0)
охватывают все возможные результаты сравнения (равенство дважды): дальнейшая оценка
else
не будет выполнена.
Перемещая «движущиеся части», следуя «правильному слиянию», как предложено , отметьте, что предварительные проверки не требуются - просто используйте «петли перемещения».
Многое можно сказать о вашем коде (начиная с комментирования) - см. обзоры кода реализации слияний в C ++ для идей.
Если вы хотите, чтобы код, который вы контролируете, был рассмотрен в CR @ SE, обязательно укажите по теме и , чтобы написать хороший вопрос .