Pergunta

Como classifico um vetor (array)?

Resposta

Para classificar um vetor (array) você deve implementar um método de ordenação ou classificação (sort). Existem diversos algorítmos conhecidos de ordenação, ditos clássicos:

Além destes algoritmos existem vários outros além de variações em suas implementações. Cada um destes algoritmo oferece um desempenho diferente: os algoritmos de seleção e bolha são os mais ineficientes mas os mais simples. O quicksort é um dos mais rápidos algoritmos existentes mas também mais complexo. Livros sobre estruturas de dados geralmente contêm vários dos algoritmos clássicos.

Seguem como exemplo os algoritmos selectionsort e bubblesort. A aplicação sugerida recebe como argumento a quantidade de valores que devem ser ordenados. São criados dois vetores de inteiros com a quantidade especificada e preenchidos com valores aleatórios entre 0 e quantidade informada. Estes vetores, que possuem os mesmos valores, são submetidos um a ordenação por seleção e o outro a ordenação por bolha.

public class SortDemo {
  public static final void main(String args[]) {
    if (args.length < 1) {
      System.out.println("Uso: SortDemo quantidadeValores");
      return;
    }
    int max = Integer.parseInt(args[0]);
    int vetor1[] = new int[max];
    int vetor2[] = new int[max];
    long inicio, fim;
    System.out.println("Preenchendo vetores com " + max + " valores...");
    for (int i=0; i<max; i++) {
      vetor1[i] = (int)(Math.random()*max);
      vetor2[i] = vetor1[i];
    }
    System.out.print("\nSelection Sort...");
    inicio = System.currentTimeMillis();
    selectionSort(vetor1);
    fim = System.currentTimeMillis();
    System.out.println("tempo: " + (fim-inicio) + "ms");
    System.out.print("\nBubble Sort...");
    inicio = System.currentTimeMillis();
    bubbleSort(vetor2);
    fim = System.currentTimeMillis();
    System.out.println("tempo: " + (fim-inicio) + "ms");
  }
  public static final void selectionSort(int v[]) {
    int temp;
    int max = v.length;
    for(int i=0; i<max-1; i++)
      for (int j=i+1; j<max; j++) {
        if (v[i]>v[j]) {
          temp = v[i];
          v[i] = v[j];
          v[j] = temp;
        }
    }
  }
  public static final void bubbleSort(int v[]) {
    int temp;
    int max = v.length;
    for(int i=max-1; i>0; i--)
      for (int j=0; j<i; j++) {
        if (v[j]>v[j+1]) {
          temp = v[j+1];
          v[j+1] = v[j];
          v[j] = temp;
        }
      }
  }
}

O tempo decorrido em milisegundos é informado apenas como referência. Sugere-se o teste com 500 ou mais valores dependendo da performance do computador utilizado. Resultados de tempo menores que 100ms não são representativos devido a precisão do relógio interno da maioria dos computadores.