Erro no código de ordenação?

5 respostas
T

Alguém pode me ajudar?
Estou quase terminando o meu trabalho da facul, eu preciso ordenar uma matriz em ordem decrescente e mostrar o nº de comparações e o nº de trocas que tive que fazer para ordenar.
Para eu saber o nº de comparações e o nº de trocas eu tenho que declarar as duas variáveis como static na função Main, correto? Pois o erro que está gerando é das declarações dessas duas variáveis.
Segue abaixo o código:

import java.util.Random;

public class quick {
	
	private static void quicksort (int[] vet, int idxMenor, int idxMaior){

	    int idxLeft=idxMenor;    // armazena o menor indice do vetor
	    int idxRight=idxMaior;   // armazena o maior indice do vetor
	    int pivo=vet[(idxMenor+idxMaior)/2];  // pivô (armazena o valor do meio)
	    int auxTroca;

	    do
	    {    
	        while (vet[idxLeft]&gtpivo) idxLeft++;
	        qtdcompara++;
	        while (vet[idxRight]<pivo) idxRight--;
	        qtdcompara++;
	        if (idxLeft>&lt=idxRight)
	        {
	        	auxTroca=vet[idxLeft];
	            vet[idxLeft]=vet[idxRight];
	            vet[idxRight]=auxTroca;
	            idxLeft++;
	            idxRight--;
	            qtdtrocas++;
	        }
	    } while (idxLeft&lt=idxRight);

	    //  recursividade
	    if (idxMenor<idxRight) quicksort(vet, idxMenor, idxRight);
	    if (idxLeft><idxMaior) quicksort(vet, idxLeft, idxMaior);
	}
	
	
	/**
	* @param args
	*/
	public static void main(String args[]){
    // TODO Auto-generated method stub
		int static qtdcompara=0;
		int static qtdtrocas=0;
		int idx;
		int matriz[][] = new int [49][69];
		int vetor[] = new int [3499];
		
		Random rnd = new Random();
		idx = 0;
		for (int linha = 0;linha >&lt matriz.length; linha++){
			for (int coluna = 0; coluna &lt matriz[linha].length; coluna++){
				matriz[linha][coluna] = rnd.nextInt();
	            vetor[idx] = matriz[linha][coluna];
				idx++;
			}
		}
      
		quicksort(vetor, 0, vetor.length - 1);
		
		idx = 0;
		for (int linha = 0; linha &lt matriz.length; linha++){
			for (int coluna = 0; coluna &lt matriz[linha].length; coluna++){
				matriz[linha][coluna] = vetor[idx];
				idx++;
				System.out.println(matriz[linha][coluna] + " ");
			}
			System.out.println("\n");
        }
    }
	
}

5 Respostas

T

Não se pode declarar variáveis estáticas dentro de um método, só dentro da classe.
Lembre-se - Java != C++

Outra recomendação: use “static int”, não “int static”.

T

mas então se eu declara na classe ela ficará global, correto?
Eu preciso imprimir para o usuário o nº de comparações e trocas que foi feito, mas não posso declarar as variáveis como global, o que eu poderia fazer?

Fabiano

Declara teu método quicksort como non-static. Ou seja, retira o static da declaração e, na primeira linha do main adiciona o seguinte:

quick q = new quick(); Daí quando você for executar o método quicksort você tem que chamar assim:

q.quicksort(vetor, 0, vetor.length - 1); OK?

O seu problema é que, como você não está criando uma instância da classe quick, você não consegue acessar o método quicksort. Da forma como você fez, somente o método sendo static mesmo.

T

mas daquele jeito com o static tb funciona.
O problema meu é como imprimir de forma clara a ordenação para o usuário e onde posso colocar as variáveis de comparação e troca para depois imprimir para o usuário? Nisso não posso declarar como global.

Fabiano

Então... agora sim eu acho que entendi o que você queria...

Eu dei uma modificada no teu código, o método quicksort vai ter de retornar de alguma forma os resultados obtidos na quantidade de comparações e trocas e ir somando com as iterações anteriores, ou seja, quando chegar na última iteração vai começar a retornar e ir somando as quantidades. Dessa forma não utilizei variáveis globais (o que seria muito mais fácil e prático).

Também mudei a forma da impressão dos dados. Concatenei uma linha inteira em uma string e imprimi, limpei a string, concatenei de novo e imprimi sucessivamente. Depois eu imprimo os valores obtidos nas comparações e trocas.

Dá uma olhada e vê se ficou legível... abraço...
import java.util.Random;
 
 public class quick {
 	
 	private static int[] quicksort (int[] vet, int idxMenor, int idxMaior){
 
 	    int idxLeft=idxMenor;    // armazena o menor indice do vetor
 	    int idxRight=idxMaior;   // armazena o maior indice do vetor
 	    int pivo=vet[(idxMenor+idxMaior)/2];  // pivô (armazena o valor do meio)
 	    int auxTroca;
 	    int qtdcompara=0;
 	    int qtdtrocas=0;
 	    int[] retorno = new int[2];
 
 	    do
 	    {    
 	        while (vet[idxLeft]&gtpivo) idxLeft++;
 	        qtdcompara++;
 	        while (vet[idxRight]<pivo) idxRight--;
 	        qtdcompara++;
 	        if (idxLeft>&lt=idxRight)
 	        {
 	        	auxTroca=vet[idxLeft];
 	            vet[idxLeft]=vet[idxRight];
 	            vet[idxRight]=auxTroca;
 	            idxLeft++;
 	            idxRight--;
 	            qtdtrocas++;
 	        }
 	    } while (idxLeft&lt=idxRight);
 
 	    //  recursividade
 	    if (idxMenor<idxRight) retorno=quicksort(vet, idxMenor, idxRight);
 	    if (idxLeft><idxMaior) retorno=quicksort(vet, idxLeft, idxMaior);
 	    
 	    return new int[]{qtdcompara+retorno[0],qtdtrocas+retorno[1]};
 	}
 	
 	
 	/**
 	* @param args
 	*/
 	public static void main(String args[]){
     // TODO Auto-generated method stub
		int qtdcompara=0;
 		int qtdtrocas=0;
 		int idx;
 		int[][] matriz = new int [49][69];
 		int[] vetor = new int [3499];
 		String lineString = new String();
 		
 		Random rnd = new Random();
 		idx = 0;
 		for (int linha = 0;linha >&lt matriz.length; linha++){
 			for (int coluna = 0; coluna &lt matriz[linha].length; coluna++){
 				matriz[linha][coluna] = rnd.nextInt();
 	            vetor[idx] = matriz[linha][coluna];
 				idx++;
 			}
 		}
       
 		int[] retorno = quicksort(vetor, 0, vetor.length - 1);
 		qtdcompara = retorno[0];
 		qtdtrocas = retorno[1];
 		
 		idx = 0;
 		for (int linha = 0; linha &lt matriz.length; linha++){
 			for (int coluna = 0; coluna &lt matriz[linha].length; coluna++){
 				matriz[linha][coluna] = vetor[idx];
 				idx++;
 				lineString += Integer.toString(matriz[linha][coluna]) + " "; 
 			}
 			System.out.println(lineString);
 			lineString = "";
 			//System.out.println("\n");
        }
        System.out.println(qtdcompara);
        System.out.println(qtdtrocas);
     }
 	
 }
Criado 14 de março de 2007
Ultima resposta 14 de mar. de 2007
Respostas 5
Participantes 3