FC ConcursosFC Concursos

Questão FC373297

Considere o programa Java abaixo. public class Ordem { public static void ordena(int[] A, int n) { if (n == 1) { return; } int m = n - 1; for (int i = 0; i < n - 1; i++) { if (A[i]

Linguagens de Programação

FCC · 2018

Considere o programa Java abaixo.


public class Ordem {


   public static void ordena(int[] A, int n) {
       if (n == 1) {
           return;
       }
       int m = n - 1;
       for (int i = 0; i < n - 1; i++) {
           if (A[i] > A[m]) {
               m = i;
           }
       }
       int t = A[m];
       A[m] = A[n - 1];
       A[n - 1] = t;
       ..I....
 }
public static void main(String[] args) {
    int[] X = {10, 15, 11, 4, 2, 7};
    ordena(X, X.length);
    for (int i = 0; i < X.length; i++) {
        System.out.print(X[i] + " ");
    }
}


   }


Para que os valores contidos no vetor X sejam apresentados em ordem crescente, a lacuna I deve ser preenchida por

  1. ordena(A, n - 1);
  2. A[m + 1] = A[n - 1];
  3. ordena(A, n);
  4. t = A[maior - 1];
  5. ordena(A, n + 1);
Mostrar resposta e comentário

Gabarito

A

Comentário do professor

A opção correta é chamar ordena(A, n - 1); porque o método implementa uma versão recursiva do *selection sort*: o laço local encontra o índice m do maior elemento entre os primeiros \(n\) elementos e o troca com A[n-1], colocando o maior no fim do subvetor.

Depois dessa troca, resta ordenar os primeiros \(n-1\) elementos. A chamada ordena(A, n - 1) reduz o problema, fazendo a recursão sobre o subvetor que ainda não está ordenado.

Esse passo é essencial para a recursividade: modificamos o parâmetro \(n\) em direção ao caso base \(n==1\), que interrompe a recursão. Sem reduzir \(n\) não haveria progresso e ocorreria recursão infinita.

Portanto, a chamada correta é ordena(A, n - 1);, que garante que em cada nível coloca-se o maior elemento na posição final do subvetor e depois ordena-se recursivamente o restante.

Conteúdo do catálogo FC Concursos · Atualizado em

Continue aprendendo