Да, это можно сделать на месте и за O ( n ), при условии, что оба входа отсортированы, и с одним проходом по обоим векторам.Вот как:
Расширить A
(вектор назначения) на B.size()
- освободить место для наших новых элементов.
Итерация назад по двум векторам, начиная с конца B
и первоначальный конец A
.Если векторы отсортированы по маленьким → большим (большим в конце), возьмите итератор, указывающий на большее число, и вставьте его в истинный конец A
.Продолжайте, пока итератор B
не достигнет начала B
.Обратные итераторы должны быть особенно хороши здесь.
Пример:
A: [ 1, 2, 4, 9 ]
B: [ 3, 7, 11 ]
* = iterator, ^ = where we're inserting, _ = unitialized
A: [ 1, 3, 4, 9*, _, _, _^ ] B: [ 3, 7, 11* ]
A: [ 1, 3, 4, 9*, _, _^, 11 ] B: [ 3, 7*, 11 ]
A: [ 1, 3, 4*, 9, _^, 9, 11 ] B: [ 3, 7*, 11 ]
A: [ 1, 3, 4*, 9^, 7, 9, 11 ] B: [ 3*, 7, 11 ]
A: [ 1, 3*, 4^, 4, 7, 9, 11 ] B: [ 3*, 7, 11 ]
A: [ 1, 3*^, 3, 4, 7, 9, 11 ] B: [ 3, 7, 11 ]
Супер редактирование: Рассматривали ли вы std::inplace_merge
?(что я, возможно, только что изобрел?)