Pessoal, estou fazendo um trabalho da facul e nele tenho que resolver o seguinte problema:
Calcular o tempo médio que algoritmos de ordenação demoram para ordenar um vetor de um determinado tamanho. No inicio o vetor terá um tamanho que eu determinarei(tamanho * 1), depois ele terá: (tamanho * 2), depois: (tamanho*4), depois: (tamanho * 8), depois: (tamanho * 16).
Irei ordenar estes vetores com os seguintes algoritmos: bubbleSort, insertSort, quickSort.
Para fazer isto escolhi fazer cada ordenacao e calculos de tempo em classes separadas: OrdenacaoBolha, OrdenacaoInsercao, OrdenacaoRapida. Escolhi implementar uma classe abstrata Ordenacao para facilitar o desenvolvimento.
Vamos às classes:
Classe Ordenacao.java:
package ordenando;
import java.util.Random;
/**
*
* @Autor: Francislon Silva
*/
public abstract class Ordenacao {
public static final int NUM_MAT = 2;
public int[] criaVetor(int tamanho)
{
int i;
int vet[];
Random aleatorio = new Random();
vet = new int[tamanho];
for(i=0;i<tamanho;i++)
{
vet[i] = 0 + aleatorio.nextInt(5000);
}
return vet;
}
public void trocar(int vet[], int num, int num2)
{
int aux;
aux = vet[num];
vet[num] = vet[num2];
vet[num2] = aux;
}
public abstract void calculandoOrdenacao();
public abstract double[] getMedia();
}
Classe OrdenacaoBolha.java:
package ordenando;
/**
*
* @Autor: Francislon Silva
*/
public class OrdenacaoBolha extends Ordenacao{
private double media[];
public OrdenacaoBolha() {
media = new double[5];
}
private void ordenar(int vet[]) {
int i;
int j;
int aux;
for(i=0;i<(vet.length);i++) {
for(j=0;j<(vet.length-i-1);j++) {
if(vet[j]>vet[j+1]) {
trocar(vet, j, j+1);
} //end if
} // end for j
} // end for i
} // end ordenar
public void calculandoOrdenacao() {
int i;
int j, aux, tam;
double inicio, fim, soma;
int vet[];
for(i = 0; i<5; i++) {
soma = 0;
for(j = 0; j < 100; j++){
tam = (int)(NUM_MAT * Math.pow(2, i));
vet = criaVetor(tam);
//System.out.println(NUM_MAT * Math.pow(2, i));
inicio = System.nanoTime();
ordenar(vet);
fim = System.nanoTime();
/*for(aux = 0; aux<vet.length;aux++) {
System.out.println(vet[aux]);
}*/
soma += (fim - inicio);
} //end for j
System.out.println("Soma: " + soma);
media[i] = soma/100;
System.out.println("Media quando o vetor tem tamanho " + ((i+1)*10) + " " + media[i]);
} //end for i
} // end calculandoOrdenacao
public double[] getMedia() {
return media;
}
}
Classe OrdenacaoInsercao.java:
package ordenando;
/**
*
* @Autor: Francislon Silva
*/
public class OrdenacaoInsercao extends Ordenacao{
private double media[];
public OrdenacaoInsercao() {
media = new double[5];
}
private void ordenar(int[] v) {
for (int i = 1; i >< v.length; i++) {
int value = v [i], j = i - 1;
while ( j >= 0 && value < v [j] ) {
v[j + 1] = v [j];
j--;
}
v[j + 1] = value;
}
}
public void calculandoOrdenacao() {
int i;
int j, aux, tam;
double inicio, fim, soma;
int vet[];
for(i = 0; i<5; i++) {
soma = 0;
for(j = 0; j < 100; j++){
tam = (int)(NUM_MAT * Math.pow(2, i));
vet = criaVetor(tam);
//System.out.println(NUM_MAT * Math.pow(2, i));
inicio = System.nanoTime();
ordenar(vet);
fim = System.nanoTime();
/*for(aux = 0; aux<vet.length;aux++) {
System.out.println(vet[aux]);
}*/
soma += (fim - inicio);
} //end for j
System.out.println("Soma: " + soma);
media[i] = soma/100;
System.out.println("Media quando o vetor tem tamanho " + ((i+1)*10) + " " + media[i]);
} //end for i
}
public double[] getMedia() {
return media;
}
}
Classe OrdenacaoRapida.java:
package ordenando;
/**
*
* @Autor: Francislon Silva
*/
public class OrdenacaoRapida extends Ordenacao{
private double media[];
/** Creates a new instance of OrdenacaoRapida */
public OrdenacaoRapida() {
media = new double[5];
}
private void ordenar(int vet[], int inicio, int fim)
{
int j;
while (inicio >< fim) {
j = separa(vet, inicio, fim);
ordenar(vet, inicio, j-1);
inicio = j + 1;
}
}
private int separa(int v[], int p, int r) {
int t, c = v[p], i = p+1, j = r;
while (/*A*/ i <= j) {
if (v[i] <= c) ++i;
else if (c < v[j]) --j;
else {
t = v[i]; v[i] = v[j]; v[j] = t;
++i; --j;
}
}
// agora i == j+1
t = v[p]; v[p] = v[j]; v[j] = t;
return j;
}
public void calculandoOrdenacao() {
int i;
int j, aux, tam;
double inicio, fim, soma;
int vet[];
for(i = 0; i<5; i++) {
soma = 0;
for(j = 0; j < 100; j++){
tam = (int)(NUM_MAT * Math.pow(2, i));
vet = criaVetor(tam);
//System.out.println(NUM_MAT * Math.pow(2, i));
inicio = System.nanoTime();
ordenar(vet, 0, tam-1);
fim = System.nanoTime();
/*for(aux = 0; aux<vet.length;aux++) {
System.out.println(vet[aux]);
}
*/
soma += (fim - inicio);
} //end for j
System.out.println("Soma: " + soma);
media[i] = soma/100;
System.out.println("Media quando o vetor tem tamanho " + ((i+1)*10) + " " + media[i]);
} //end for i
}
public double[] getMedia() {
return media;
}
}
A questão é o seguinte galera: teria alguma forma mais prática/eficiente de fazer isto? Pois cada um tem uma forma de enxergar a implementação de determinado problema.
Outra dúvida, eu estou passando um vetor como parametro para ordenar em outra classe. Já ouvi dizer que em Java todas as passagens de parametros são copias, mas também já ouvi dizer que é possivel fazer da forma que fiz. Alguém poderia esclarecer melhor isto? Afinal, em java tem ou não passagem por referencia? É correto fazer passagem por referencia? Isto vai contra a lógica de OO?
Agradeço a ajuda de todos.
>
