Obrigada, Henrique!
Veja se compreendi a sua dúvida e se a minha resposta te esclarece, por favor.
Pelo que entendi, sua dúvida está relacionada à lógica de como o algoritmo de merge sort está reconstruindo o array na função mergeSort().
O que pode estar causando confusão é que, embora o array array seja reatribuído dentro da função mergeSort(), isso não modifica os arrays parte1 e parte2 que foram passados como argumentos. Esses arrays são tratados de forma imutável dentro das funções, pois array.slice() cria cópias dos segmentos do array original, não os modifica diretamente.
Portanto, a reconstrução de array ocorre na mesclagem feita pela função ordena(), onde os elementos de parte1 e parte2 são mesclados em ordem crescente.
Vamos analisar o código em partes.
Na função mergeSort(), a lista de livros é dividida ao meio recursivamente até que cada parte tenha apenas um elemento. Isso é feito dividindo o array original em duas metades, representadas pelas variáveis parte1 e parte2;
Quando as partes são suficientemente pequenas (ou seja, contêm apenas um elemento), elas são passadas para a função ordena() para serem ordenadas e mescladas;
Na função ordena(), duas partes ordenadas são mescladas em um único array ordenado. Ela compara os preços dos produtos em parte1 e parte2, e os insere no array resultado em ordem crescente.
Após a mesclagem, o array resultado é retornado como o array ordenado.
Se esta resposta te ajudou, favor marcar como solucionado ✓