Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida na condição do "if"

Durante a implementação do código da função "particiona", dentro do loop do while principal, existem internamente mais dois loop while que percorrem o array pela esquerda e direita comparando os itens do array com o pivo. Após esses dois while interiores é feita mais uma verificação através de um "if" para somente então aplicar a função "trocaLugar".

A condição colocada neste "if" para executar a função "trocaLugar" é que "atualEsquerda <=atualDireita".

Eu não entendi a necessidade de aplicar esta condição através do "if". Essa mesma condição não está sendo controlada através do while principal?

while (atualEsquerda <= atualDireita) {
        while(array[atualEsquerda].preco < pivo.preco) {
            atualEsquerda++;
        }
        while(array[atualDireita].preco > pivo.preco) {
            atualDireita--;
        }

        if (atualEsquerda <= atualDireita) {
            trocaLugar(array, atualEsquerda, atualDireita);
            atualEsquerda++;
            atualDireita--;
        }
    }
1 resposta
solução!

Bom dia, Marcos!

Até onde pude entender, os "while" secundários funcionam como condições de continuidade dos procedimentos do "while" principal. A condição de parada está dentro do "while" primário. Já esse condicional "if" é o recurso de substituição de elementos de um objeto. Agora, as chamadas das somas "atualEsquerda++" e "atualDireita--" dentro da função "if" são necessárias ao andamento do while. Elas promovem a atualização dos valores atuais dos índices à direita e à esquerda, respectivamente, para que o código faça uma nova operação.

Retire essas somas - temporariamente - do seu código e verá que não funcionará. Não se esqueça de pressionar "Ctrl C" no máximo um segundo após o início da iteração, para que não tenha problemas de hardware.

Veremos agora, pelo método de Jack, o que faz esse "if":

Considerando de antemão que a condição do "while" principal é verdadeira, a do "if" também será. Assim, se o índice atual à esquerda for menor ou igual ao índice atual à direita, será executada a função "trocaLugar".

Essa função trocará os elementos do objeto "array" de posição "atualEsquerda" com o de posição "atualDireita", ou seja, como exemplo, se o valor do índice "atualEsquerda" for 2 e o do "atualDireita" for 5, sendo 2 menor que 5, será feita a troca dos elementos vinculados a esses índices.

Ao final da troca, os índices "atualEsquerda" e "atualDireita" serão atualizados em "+1" e "-1", respectivamente, para que seja feita uma nova iteração, com outros elementos.

While secundários: Contudo, no primeiro "while" secundário, enquanto o preço do elemento do objeto na posição "atualEsquerda" for menor que o preço do elemento "pivo", não será feita nenhuma mudança na ordenação do objeto e à posição "atualEsquerda" será adicionada 1.

Similarmente, no segundo "while", se o preço do elemento de posição "atualDireita" for maior que o do elemento "pivo", será reduzido em 1 o valor do índice da posição "atualDireita" e nenhuma alteração será feita à ordenação do objeto.

Essas são as duas condições de não alteração da ordem dos elementos dentro do objeto. A primeira condição é executada e, logo após, a segunda também é. Se qualquer umas das duas condições do tipo "while" ou ambas forem falsas, o "if" será executado.

Espero que não tenha te confundido mais.