Geral Múltipla Escolha

Considere uma classe onde está definida uma variável size=10 e o método insertionSort da classe Sorter<T, size>::insertionSort(). Suponha que, por engano, o programador digitou a primeira linha do while como while (temp > a[j]). Apesar do erro, o método funciona como previsto na primeira vez que o programador o utiliza para ordenar um array em ordem decrescente. Quais das seguintes razões poderia explicar isso?

Considere uma classe onde está definida uma variável size=10 e o método insertionSort da classe Sorter<T, size>::insertionSort(). Suponha que, por engano, o programador digitou a primeira linha do while como while (temp > a[j]). Apesar do erro, o método funciona como previsto na primeira vez que o programador o utiliza para ordenar um array em ordem decrescente. Quais das seguintes razões poderia explicar isso?

  1. O primeiro elemento era o maior da array
  2. A array já estava ordenada por ordem decrescente
  3. O primeiro elemento era menor ou igual a todos os outros na array

Resolução completa

Explicação passo a passo

C
Alternativa C

Alternativa C (Correspondente às afirmações I e II)

Análise do Problema

A questão apresenta um erro comum em implementações de algoritmos de ordenação: a falta de verificação de limites de índice no laço interno.

O código implementa o Insertion Sort (Ordenação por Inserção) para ordenar um vetor em ordem decrescente. O objetivo é garantir que elementos maiores fiquem nas posições iniciais (índice 0).

O Erro de Programação

A condição correta do laço while deveria ser:

while (j >= 0 && temp > a[j])

O programador digitou apenas:

while (temp > a[j])

Isso remove a proteção contra acesso fora dos limites (j >= 0). Se j chegar a -1, o programa tentará acessar a[-1], causando um erro de segmentação (crash). Para que o método funcione sem erros, o laço deve terminar antes de j se tornar negativo.

Análise das Afirmações

Vamos verificar quais cenários impedem que j chegue a -1 antes da comparação de valores falhar.

AfirmaçãoCenárioComportamento do LaçoSegurança
I. Primeiro elemento é o maiora[0] é o máximo global.Quando j chega a 0, verifica-se temp > a[0]. Como temp vem de índices subsequentes, temp <= a[0]. A condição falha.Seguro (Laço termina)
II. Array já ordenada desc.a[i] <= a[i-1].Para qualquer i, temp é menor ou igual ao anterior imediatamente. temp > a[j] é falso na primeira checagem.Seguro (Laço não entra)
III. Primeiro elemento é menora[0] é o mínimo.Se temp > a[0], o laço continua até j = -1.Inseguro (Crash)

Conclusão

Para que o erro de out-of-bounds não ocorra na primeira execução, a condição de parada temp > a[j] deve retornar false quando j == 0. Isso acontece tanto se o primeiro elemento for o maior da lista (Afirmação I) quanto se a lista já estiver ordenada (Afirmação II).

Portanto, as razões I e II explicam corretamente por que o método funcionou apesar do erro.

Tem outra questão para resolver?

Resolver agora com IA

Mais questões de Geral

Ver mais Geral resolvidas

Tem outra questão de Geral?

Cole o enunciado, tire uma foto ou descreva o problema — a IA resolve com explicação completa em segundos.