Inversão de Vetor (RESOLVIDO)

Galera estou com o seguinte exercício.

  • Escreva um algoritmo que leia um vetor de 10 posições e mostre-o. Faça um procedimento que faça um vetor inverso, trocando o 1º elemento com o último, o 2º elemento com o penúltimo e assim sucessivamente. Mostre o novo vetor depois da troca.

Quando mostro o vetor ele não ordena, onde estou errando ?
Segue o código :

public class Lista1ex9 {

public static void inverso (int v[]){
	int aux = 0 ;

	for (int i = 0; i <= 9; i++ ) {
		for (int j = 9; j >= 0 ; j-- ) {
			aux = v[j];
			v[j] = v[i];
			v[i] = aux;

		}

		System.out.print(" | ");
		System.out.print(v[i]);
	}
}
public static void main(String[] args) {
	int v[] = new int[10];
	System.out.println("ANTES");
	System.out.println();
	for (int i = 0;i <= 9 ; i++ ) {
		v[i] = i;
		System.out.print(" | ");
		System.out.print(v[i]);
	}

	System.out.println();
	System.out.println("DEPOIS");
	System.out.println();
		inverso(v);
}

}

Legal que vc colocou o código que tentou fazer.

Seu principal erro é aqueles 2 loops. Eles estão rodam umas cem vezes pra não surtir efeito nenhum. Acrescentei um contador no seu método inverso pra vc ver, faz o teste com isso:

/* ... */

public static void inverso (int v[]){
    int aux = 0 ;
    int counter = 0;
    for (int i = 0; i <= 9; i++ ) {
        for (int j = 9; j >= 0 ; j-- ) {
            aux = v[j];
            v[j] = v[i];
            v[i] = aux;
            counter++;
        }

        System.out.print(" | ");
        System.out.print(v[i]);
    }

    System.out.println("\n\nCounter: " + counter);
}

/* ... */

E na verdade o que vc quer é que o loop vá apenas até metade do tal vetor. Fiz umas alterações e organizei melhor o código:

public class Main {
    public static void inverter(int[] v){
        int i = 0;
        int j = v.length - 1;
        int a = 0;
        int g = v.length / 2;

        while ( i < g ) {
            a      = v[j];
            v[j--] = v[i];
            v[i++] = a;
        }
    }

    public static void mostrar(int[] v) {
        for (int i = 0; i < v.length; i++)
            System.out.printf("%d%s", v[i], (i < v.length - 1) ? " | " : "\n");
    }

    public static void inicializar(int[] v) {
        for (int i = 0; i < v.length; i++) v[i] = i;
    }

    public static void main(String[] args) {
        int v[] = new int[10];

        inicializar(v);
        mostrar(v);
        inverter(v);
        mostrar(v);
    }
}

O legal dessa forma que fiz, usando o atributo length do array é que vc pode usar um vetor de qualquer tamanho que irá funcionar normalmente, pelo menos assim espero!

2 curtidas

O problema está exatamente onde o @wldomiciano escreveu.

Além de não fazer nada neste caso, esse for dentro do outro aí adiciona uma complexidade tamanha no seu algoritmo: pra cara elemento ele percorre o vetor todo novamente, o que torna uma complexidade n^2 (quadrática). Dependendo do tamanho do vetor isso poderia levar muito tempo pra ser executado.

for (int i = 0; i <= 9; i++ ) {
	for (int j = 9; j >= 0 ; j-- ) {

Dá pra fazer como ele recomendou (com while), mas se não quiser mudar toda a lógica do teu algoritmo, basta fazer apenas um for que vai até a metade do vetor:

for (i = 0; i < v.length / 2; i++, j--) {

Daí é só fazer a troca.

2 curtidas

Obrigado cara, consegui melhor meu erro depois do contador.

2 curtidas

Gente simplifiquem!!

Collections.reverse(lista);

https://www.tutorialspoint.com/java/util/collections_reverse.htm

nossa, que algoritmo sensacional, eu não conhecia!

É um exercício, dificilmente seria certo usar este método a menos que seja um exercício pra testar seu conhecimento de Collections.