Если Вы используете именно массив, то для того чтобы добавить в него элементы Вам всё-равно придётся разместить в памяти другой массив -- большего размера. А раз Вам всё равно придётся размещать в памяти массив большего размера, то для сортировки используйте слияние двух отсортированных массивов.

Однако вызывает недоумение почему для 30-миллионных контейнеров выбран именно массив, а не список. В случае списка реаллокация данных была бы не нужна вовсе. Вы больше времени угрохаете на реаллокацию, чем на слияние как таковое.

В случае списка - слияние "по месту", без реаллокации.

Короче, большой контейнер (на 30 миллионов) -- список, а маленький контейнер (на 1 миллион) -- массив. Массив сортируете по обычному, затем сливаете его в список.