Oi, Lorena! Tudo bem, sim! E com você?
Muito obrigado pela resposta!
Eu ainda não consegui entender a necessidade da verificação feita por esse if. Vou tentar detalhar a minha compreensão do funcionamento da função para ficar mais fácil você apontar a falha na minha interpretação.
Usando o exemplo da aula, a função quickSort() é chamada inicialmente com o argumento listaLivros, um array de 11 elementos. Ao passar por esse primeiro if, o retorno será true (11 > 1). Daí será chamada a função particiona() que, após fazer as devidas verificações e manipular os valores de 'esquerda' e 'direita', fará algumas alterações na ordenação do array original (porém sem alterar seu tamanho) através de trocaLugar() e retornará um valor para a variável indiceAtual.
O próximo passo é passar pelo if (esquerda < indiceAtual - 1). Essa verificação sendo true, a função quickSort é chamada novamente, e o array passado como argumento nessa segunda execução segue sendo listaLivros, que segue tendo 11 elementos e passará novamente pelo primeiro if de quickSort como (11 > 1).
E isso continua ocorrendo em todas as camadas de recursão. Embora listaLivros tenha sua ordem alterada ao longo do processamento das diversas recursões, seu length não é alterado em momento nenhum. Em todas as camadas de execução do quickSort, 'if (array.length > 1)' sempre será (11 > 1). Por isso eu não vejo como essa verificação é responsável por interromper as recursões.
Nos testes de mesa que eu fiz, cada camada de execução de quickSort foi encerra quando: os argumentos 'esquerda' e 'direita' entram na função com 1 unidade de diferença (ex.: esquerda = 3 e direita = 4) e então o retorno da função particiona() para indiceAtual é igual ao valor de 'direita' (4, nesse exemplo). Nesse caso:
- if (esquerda < indiceAtual -1) será (3 < 4 -1) => (3 < 3) => false
- if (indiceAtual < direita) será (4 < 4) => false
Passando por ambos if's como falso, essa camada de execução de quickSort é encerrada, retornando ao ponto de execução da camada anterior, que seguirá executando e possivelmente entrando em novas camadas, e será encerrada quando a mesma condição ocorrer (ou seja, 'esquerda' for igual a 'direita -1' e particiona() retornar um valor igual a 'direita'; digamos esquerda = 6, direita = 7, e particiona() retornando 7). E assim sucessivamente para cada camada.
Eu testei a função sem a verificação 'if (array.length > 1', para diversos tamanhos de lista (incluindo uma lista com 1 elemento), e tudo funcionou dentro do esperado.