Ordem alfabética

tipo, o seu bublesort esta sendo amis rapido pelos seguintes motivos:

:arrow: a comparacao, vc esta comparando soh a primeira letra, enquanto eu estou chamando um metodo da classe String para fazer isso, esse metodo vai continuar comparando se as letras forem iguais, e lembre-se chamada a metodo tb consome tempo

:arrow: esse ex eu fiz como um ex, eu postei desse jeito pra vcs verem como funciona, desse jeito fica MUITO mais rapido:

public void quicksort(int p, int q, String array[]){
 if (p < q){
  int j = p - 1;
  String aux = array[q];
  for (int i = p; i <= q; i++){
   if (array[i].compareTo(aux) <= 0){
    String aux2 = array[i];
    array[i] = array[++j];
    array[j] = aux2;
   }
  }
  quicksort(p, j - 1, array);
  quicksort(j + 1, q, array);
 }
}

e tipo, teste denovo, soh q agora com o seguinte array:

String array[] = {"aaz", "aa16", "aah", "a716", "bah", "182", "132"};

vc vai verificar q o seu codigo vai reconhecer “aaz” como igual a “aa16”…

[quote=“Felipe”]tipo, o seu bublesort esta sendo amis rapido pelos seguintes motivos:

:arrow: a comparacao, vc esta comparando soh a primeira letra, enquanto eu estou chamando um metodo da classe String para fazer isso, esse metodo vai continuar comparando se as letras forem iguais, e lembre-se chamada a metodo tb consome tempo

:arrow: esse ex eu fiz como um ex, eu postei desse jeito pra vcs verem como funciona, desse jeito fica MUITO mais rapido:

public void quicksort(int p, int q, String array[]){
 if (p < q){
  int j = p - 1;
  String aux = array[q];
  for (int i = p; i <= q; i++){
   if (array[i].compareTo(aux) <= 0){
    String aux2 = array[i];
    array[i] = array[++j];
    array[j] = aux2;
   }
  }
  quicksort(p, j - 1, array);
  quicksort(j + 1, q, array);
 }
}

e tipo, teste denovo, soh q agora com o seguinte array:

String array[] = {"aaz", "aa16", "aah", "a716", "bah", "182", "132"};

vc vai verificar q o seu codigo vai reconhecer “aaz” como igual a “aa16”…[/quote]

Depois testo essa sua versão, e sobre a ordenação, sim, foi o que eu disse, mas nesse caso a solucao teria sido a melhor (ordenar so a primeira letra), ou ate mesmo se fosse um int [], afinal, é só o número pra comparar…depois vejo se testo mesmo…depois de ver o shear sort não tem nem por que discutir velocidade de bubble e quick :slight_smile:

Além do que a fórmula diz tudo:

Bubble Sort is a sequential algorithm, with an average case time of O(n2). 
Quick Sort is a sequential algorithm, with an average case time of O(n log n). 
Odd-Even Transposition Sort is a parallel algorithm, with an worst case time of O(n), running on n processors. Its absolute speed up is O(log n), so its efficiency is O((log n)/n). 
Shear Sort is a parallel algorithm, with an worst case time of O(n1/2 log n), running on n processors. Its absolute speed up is O(n1/2), so its efficiency is O(1/n1/2). 

jah adiantando com um teste q eu fiz:

Buble tempo: 1499
Array:
182 132 aaz aa16 aah a716 bah
Quicksort tempo: 1248
Array:
132 182 a716 aa16 aah aaz bah

OBS: note que o seu buble sort n organiza apartir da segunda letra, ao contrario do quicksort, por isso ele esta conseguindo um desempenho um pouco maior do q um bublesort teria, pois n esta organizando devidamente…

cheguei nisso com esse codigo:

public class Teste{
 public static void main(String args[]){
  String array[], copia[] = {"aaz", "aa16", "aah", "a716", "bah", "182", "132"};
  long ms = 0;
  array = new String[copia.length];
  copia(array, copia);
  ms = System.currentTimeMillis();
  for (int i = 0; i < 1000000; i++){
   copia(array, copia);
   bubble(array);
  }
  System.out.println("Buble tempo: " + (System.currentTimeMillis() - ms));
  System.out.println("Array: ");
  for (int i = 0; i < array.length; i++) System.out.print(array[i] + " ");
  System.out.println();
  ms = System.currentTimeMillis();
  for (int i = 0; i < 1000000; i++){
   copia(array, copia);
   quicksort(0, array.length - 1, array);
  }
  System.out.println("Quicksort tempo: " + (System.currentTimeMillis() - ms));
  System.out.println("Array: ");
  for (int i = 0; i < array.length; i++) System.out.print(array[i] + " ");
  System.out.println();
 }
 public static void copia(String array[], String copia[]){
  for (int i = 0; i < array.length; i++) array[i] = copia[i];
 }
 public static void quicksort(int p, int q, String array[]){
 if (p < q){
  int j = p - 1;
  String aux = array[q];
  for (int i = p; i <= q; i++){
   if (array[i].compareTo(aux) <= 0){
    String aux2 = array[i];
    array[i] = array[++j];
    array[j] = aux2;
   }
  }
  quicksort(p, j - 1, array);
  quicksort(j + 1, q, array);
 }
} 
 public static String[] bubble(String[] strArray){
        int   cur = 0;
        int limit = strArray.length - 1;
        int start = 0;
        while(start < limit) {
            for(cur = start; cur < limit; cur++) {
                int strArrayAt = (int) strArray[cur].charAt(0);
                if(strArrayAt >= 97 && strArrayAt <= 122) {
                    strArrayAt = strArrayAt - 32;
                }
                int strArrayAtPlusOne = (int) strArray[cur + 1].charAt(0);
                if(strArrayAtPlusOne >= 97 && strArrayAtPlusOne <= 122) {
                    strArrayAtPlusOne = strArrayAtPlusOne - 32;
                }
                if(strArrayAt > strArrayAtPlusOne) {
                    String tempValue  = strArray[cur];
                    strArray[cur]     = strArray[cur + 1];
                    strArray[cur + 1] = tempValue;
                }
            }
            for(cur = limit; --cur >= start;) {
                int strArrayAt = (int) strArray[cur].charAt(0);
                if(strArrayAt >= 97 && strArrayAt <= 122) {
                    strArrayAt = strArrayAt - 32;
                }
                int strArrayAtPlusOne = (int) strArray[cur + 1].charAt(0);
                if(strArrayAtPlusOne >= 97 && strArrayAtPlusOne <= 122) {
                    strArrayAtPlusOne = strArrayAtPlusOne - 32;
                }
                if(strArrayAt > strArrayAtPlusOne) {
                    String tempValue = strArray[cur];
                    strArray[cur]      = strArray[cur + 1];
                    strArray[cur + 1]  = tempValue;
                }
            }
            start++;
            limit--;
        }
        return strArray;
    } 
}

OBS: tanto no quicksort como no buble eu copiei o array antigo, por como em arrays eh passado por referencia, n faz sentido organizar um array jah organizado, se for organizar arrays jah organizados o bubble sort provavelmente teria um desempenho mais proximo (ou talvez ateh melhor) q o quicksort, jah q o quicksort faz trocas com elementos iguals enquanto o bubblesort nao, por isso q eu n digo q o quicksort eh o mais rapido, e sim um dos mais rapidos, pq dependendo da situacao pode ser um outro metodo de ordenacao o mais apropriado :grin:

[quote=“Felipe”]jah adiantando com um teste q eu fiz:

Buble tempo: 1499
Array:
182 132 aaz aa16 aah a716 bah
Quicksort tempo: 1248
Array:
132 182 a716 aa16 aah aaz bah

OBS: note que o seu buble sort n organiza apartir da segunda letra, ao contrario do quicksort, por isso ele esta conseguindo um desempenho um pouco maior do q um bublesort teria, pois n esta organizando devidamente…

cheguei nisso com esse codigo:

public class Teste{
 public static void main(String args[]){
  String array[], copia[] = {"aaz", "aa16", "aah", "a716", "bah", "182", "132"};
  long ms = 0;
  array = new String[copia.length];
  copia(array, copia);
  ms = System.currentTimeMillis();
  for (int i = 0; i < 1000000; i++){
   copia(array, copia);
   bubble(array);
  }
  System.out.println("Buble tempo: " + (System.currentTimeMillis() - ms));
  System.out.println("Array: ");
  for (int i = 0; i < array.length; i++) System.out.print(array[i] + " ");
  System.out.println();
  ms = System.currentTimeMillis();
  for (int i = 0; i < 1000000; i++){
   copia(array, copia);
   quicksort(0, array.length - 1, array);
  }
  System.out.println("Quicksort tempo: " + (System.currentTimeMillis() - ms));
  System.out.println("Array: ");
  for (int i = 0; i < array.length; i++) System.out.print(array[i] + " ");
  System.out.println();
 }
 public static void copia(String array[], String copia[]){
  for (int i = 0; i < array.length; i++) array[i] = copia[i];
 }
 public static void quicksort(int p, int q, String array[]){
 if (p < q){
  int j = p - 1;
  String aux = array[q];
  for (int i = p; i <= q; i++){
   if (array[i].compareTo(aux) <= 0){
    String aux2 = array[i];
    array[i] = array[++j];
    array[j] = aux2;
   }
  }
  quicksort(p, j - 1, array);
  quicksort(j + 1, q, array);
 }
} 
 public static String[] bubble(String[] strArray){
        int   cur = 0;
        int limit = strArray.length - 1;
        int start = 0;
        while(start < limit) {
            for(cur = start; cur < limit; cur++) {
                int strArrayAt = (int) strArray[cur].charAt(0);
                if(strArrayAt >= 97 && strArrayAt <= 122) {
                    strArrayAt = strArrayAt - 32;
                }
                int strArrayAtPlusOne = (int) strArray[cur + 1].charAt(0);
                if(strArrayAtPlusOne >= 97 && strArrayAtPlusOne <= 122) {
                    strArrayAtPlusOne = strArrayAtPlusOne - 32;
                }
                if(strArrayAt > strArrayAtPlusOne) {
                    String tempValue  = strArray[cur];
                    strArray[cur]     = strArray[cur + 1];
                    strArray[cur + 1] = tempValue;
                }
            }
            for(cur = limit; --cur >= start;) {
                int strArrayAt = (int) strArray[cur].charAt(0);
                if(strArrayAt >= 97 && strArrayAt <= 122) {
                    strArrayAt = strArrayAt - 32;
                }
                int strArrayAtPlusOne = (int) strArray[cur + 1].charAt(0);
                if(strArrayAtPlusOne >= 97 && strArrayAtPlusOne <= 122) {
                    strArrayAtPlusOne = strArrayAtPlusOne - 32;
                }
                if(strArrayAt > strArrayAtPlusOne) {
                    String tempValue = strArray[cur];
                    strArray[cur]      = strArray[cur + 1];
                    strArray[cur + 1]  = tempValue;
                }
            }
            start++;
            limit--;
        }
        return strArray;
    } 
}

OBS: tanto no quicksort como no buble eu copiei o array antigo, por como em arrays eh passado por referencia, n faz sentido organizar um array jah organizado, se for organizar arrays jah organizados o bubble sort provavelmente teria um desempenho mais proximo (ou talvez ateh melhor) q o quicksort, jah q o quicksort faz trocas com elementos iguals enquanto o bubblesort nao, por isso q eu n digo q o quicksort eh o mais rapido, e sim um dos mais rapidos, pq dependendo da situacao pode ser um outro metodo de ordenacao o mais apropriado :grin:[/quote]

Sim, no ultimo post que coloquei, usei cópia ( .clone() ) pois estava usando por referencia no comeco e nem tinha percebido…tipo, na primeira rodada ja estava tudo organizado e ai o bench era inutil, mas no ultimo codigo que coloquei esta usando clonando o negocio e fazendo tudo direitinho…

O meu bubble so ve o primeiro caractere mesmo.

Vou rodar seu codigo agora aqui e tentar escrever alguma coisa mais rapida so por diversao mesmo (com certeza nao vou conseguir, mas enfim…)…

Ah, agora que vi o que voce quis dizer, realmente, ele estava usando o mesmo array ja ordenado…ugh, foi o sono :slight_smile:

Mas…(versao ja esta vindo)

[quote=“mavi”]Ah, agora que vi o que voce quis dizer, realmente, ele estava usando o mesmo array ja ordenado…ugh, foi o sono :slight_smile:

Mas…(versao ja esta vindo)[/quote]

public class Bench { 
    public static void main(String [] args) {
        String [] array = {"aaz", "aa16", "aah", "a716", "bah", "182", "132"}; 
        String [] copia = array.clone();
        long str, end;
        str = System.currentTimeMillis(); 
        for(int i = 0; i < 250000; i++) {
            copia = array.clone();
            bubble(copia); 
        } 
        end = System.currentTimeMillis();
        System.out.println("Buble tempo: " + (end - str)); 
        System.out.println("Array: "); 
        for(int i = 0; i < array.length; i++)
            System.out.print(array[i] + " "); 
        System.out.println(); 
        str = System.currentTimeMillis(); 
        for(int i = 0; i < 250000; i++) {
            copia = array.clone();
            quicksort(0, array.length - 1, array); 
        } 
        end = System.currentTimeMillis();
        System.out.println("Quicksort tempo: " + (end - str)); 
        System.out.println("Array: "); 
        for(int i = 0; i < array.length; i++) 
            System.out.print(array[i] + " "); 
        System.out.println(); 
    } 
    public static void quicksort(int p, int q, String array[]){ 
        if(p < q) { 
            int      j = p - 1; 
            String aux = array[q]; 
            for(int i = p; i <= q; i++) {
            if(array[i].compareTo(aux) <= 0) {
                String aux2 = array[i]; 
                array[i] = array[++j]; 
                array[j] = aux2; 
            } 
        } 
        quicksort(p, j - 1, array); 
        quicksort(j + 1, q, array); 
    } 
    } 
    public static String[] bubble(String[] strArray){ 
        int   cur = 0; 
        int limit = strArray.length - 1; 
        int start = 0; 
        while(start < limit) { 
            for(cur = start; cur < limit; cur++) { 
                int strArrayAt = (int) strArray[cur].charAt(0); 
                if(strArrayAt >= 97 && strArrayAt <= 122) { 
                    strArrayAt = strArrayAt - 32; 
                } 
                int strArrayAtPlusOne = (int) strArray[cur + 1].charAt(0); 
                if(strArrayAtPlusOne >= 97 && strArrayAtPlusOne <= 122) { 
                    strArrayAtPlusOne = strArrayAtPlusOne - 32; 
                } 
                if(strArrayAt > strArrayAtPlusOne) { 
                    String tempValue  = strArray[cur]; 
                    strArray[cur]     = strArray[cur + 1]; 
                    strArray[cur + 1] = tempValue; 
                } 
            } 
            for(cur = limit; --cur >= start;) { 
                int strArrayAt = (int) strArray[cur].charAt(0); 
                if(strArrayAt >= 97 && strArrayAt <= 122) { 
                    strArrayAt = strArrayAt - 32; 
                } 
                int strArrayAtPlusOne = (int) strArray[cur + 1].charAt(0); 
                if(strArrayAtPlusOne >= 97 && strArrayAtPlusOne <= 122) { 
                    strArrayAtPlusOne = strArrayAtPlusOne - 32; 
                } 
                if(strArrayAt > strArrayAtPlusOne) { 
                    String tempValue = strArray[cur]; 
                    strArray[cur]      = strArray[cur + 1]; 
                    strArray[cur + 1]  = tempValue; 
                } 
            } 
            start++; 
            limit--; 
        } 
        return strArray; 
    } 
}

O bubble ainda está ganhando, MAS, reconheco que ele so ordena o primeiro caractere, e por isso, apesar de ser mais rápido NESSE caso, é obviamente menos eficiente (se comparasse todos caracteres, nesse caso, em que a string tem em media 3 letras, provavelmente demoraria o triplo).

Agora vou tentar fazer uma versao fuçada de um algoritmo que imaginei na hora fertil do dia (banheiro).

Detalhes constadados:

#1: Em um char só (“a”, “b”, “z”, “i”, “u”, “o”) a performance é quase igual (em um array pequeno, pois o bubble quanto maior o array, mais lento).
#2: A sua implementação considera que o ‘E’ vem antes do ‘a’ (normalmente isso não é bom, depende da aplicação).

tipo, vc n pode esquecer q o algoritimo eh de ordenacao, e nao de comparacao de Strings, portanto qndo se vai fazer ot este de qual algoritimo eh mais rapido, se usa int, dai eh soh x > y e pronto…

e como vc disse, o buble sort fica lento com arrays muito grandes, depois posto um teste aki para ilustrar isso… por isso q eu prefiro o quicksort, pq com arrays pequenos, a diferenca vai ser de alguns ms (talvez alguns poucos nano segundos), algo q nem vai dar pra notar a diferenca, e agora se o array tiver, por ex 10000 elementos, a deferenca vai ser grande, de varios segundos, dependendo do computador talvez ateh minutos!!!

e como eu jah disse, em cada situacao um metodo eh mais indicado, por ex, se vc tiver uma lista q jah esta organizada, e vc quiser adicionar um novo elemento na sequencia, se vc fizer um insertionsort sem o loop externo, vai ser MUITO mais rapido do q qquer outro metodo citado neste topico!

fiz um teste agora usando inteiros em q a diferenca ficou bem evidente:

quicksort levou 33 milisegundos e bublesort levou mais de 84 segundos, uma diferenca maior q 2000x!!!

usei esse codigo pra esse teste:

OBS: alterei seu codigo para funcionar com inteiros, caso eu tenha cometido algum equivoco ou deserrumado algo sem querer me avise :wink:

public class Teste{
 public static void main(String args[]){
  long ms;
  int array[], copia[] = geraArray(100000);
  array = new int[copia.length];
  copia(array, copia);
  ms = System.currentTimeMillis();
  quicksort(0, array.length - 1, array);
  System.out.println("Quicksort: " + (System.currentTimeMillis() - ms));
  copia(array, copia);
  ms = System.currentTimeMillis();
  bubble(array);
  System.out.println("Bubble: " + (System.currentTimeMillis() - ms));
 }
 public static void copia(int array[], int copia[]){
  for (int i = 0; i < array.length; i++){
   array[i] = copia[i];
  }
 }
 public static int[] geraArray(int size){
  int array[] = new int[size];
  for (int i = 0; i < size; i++){
   array[i] = (int)(Math.random() * size);
  }
  return array;
 }
 public static void quicksort(int p, int q, int array[]){
 if (p < q){
  int j = p - 1;
  int aux = array[q];
  for (int i = p; i <= q; i++){
   if (array[i] <= aux){
    int aux2 = array[i];
    array[i] = array[++j];
    array[j] = aux2;
   }
  }
  quicksort(p, j - 1, array);
  quicksort(j + 1, q, array);
 }
} 
 public static int[] bubble(int[] intArray){
        int   cur = 0;
        int limit = intArray.length - 1;
        int start = 0;
        while(start < limit) {
            for(cur = start; cur < limit; cur++) {
                if(intArray[cur] > intArray[cur + 1]) {
                    int tempValue  = intArray[cur];
                    intArray[cur]     = intArray[cur + 1];
                    intArray[cur + 1] = tempValue;
                }
            }
            for(cur = limit; --cur >= start;) {
                if(intArray[cur] > intArray[cur + 1]) {
                    int tempValue = intArray[cur];
                    intArray[cur]      = intArray[cur + 1];
                    intArray[cur + 1]  = tempValue;
                }
            }
            start++;
            limit--;
        }
        return intArray;
    } 
}

outra observacao, vc n precisa retornar o array, pois os arrays sao passados por referencia, entaum as modificacoes feitas no metodo vao afetar o array original (por isso q eh feita uma copia)…

qndo estavamos comparando strings a diferenca era pequena (e o bublesort chegava a ser mais rapido), pq alem de estarmos usando arrays muito pequenos (onde ainda assim o quicksort eh mais rapido, a nao ser claro se for um array de 1 ou 2 elementos), vc estava comparando apenas o primeiro caractere, como eu jah disse inumeras vezes, vc tb pode comparar apenas o primeiro caractere usando o quicksort, vai ficar ainda mais rapido, mas eu aconcelho suar o metodo compareTo que compara as strings ateh achar qual eh a q vem antes…

import java.util.*;
public class teste {
public static void main(String[] args) {
String a[] = {“Maria”, “Joao”, “Renan”};
List lista = Arrays.asList(a);
Collections.sort(lista);
System.out.println(lista);
}
}

Seguindo este exemplo mais simples que ja me basta ^^ nesta parte aqui oh “String a[] = {“Maria”, “Joao”, “Renan”};” eu gostaria de nao por maria, joao … eu ja tenho Titulos de livros para por ae que apresentam em outro Array ^^ como poderia jogar ali ? vamos supor …

Livros temp = new Livros();
temp = (Livros) lista_de_livros[i];
for (int i = 0; i < 10; i++)
{
String a[] = temp.getTitulo();
}

porém nao funciona desta forma =/

neste seu trecho voce quer pegar os titulos e preencher na ordem o vetor a que voce esta criando??

Livros temp = new Livros&#40;&#41;;
temp = &#40;Livros&#41; lista_de_livros&#91;i&#93;;
for &#40;int i = 0; i &lt; 10; i++&#41;
&#123;
String a&#91;&#93; = temp.getTitulo&#40;&#41;;
&#125;

entao voce deveria trazer a instancia de “a” para fora do laço, pois ele esta iterando isso vai dar erro de compilacao… e colocar o indice no vetor temp para pegar o titulo e entao colocar no “a”.

String&#91;&#93; a = new String&#91;temp.length&#93;;

for&#40;;;&#41;&#123;
   a = temp&#91;i&#93;.get&#40;&#41;;
&#125;

entendeu!

[quote=“Felipe”]fiz um teste agora usando inteiros em q a diferenca ficou bem evidente:

quicksort levou 33 milisegundos e bublesort levou mais de 84 segundos, uma diferenca maior q 2000x!!!

usei esse codigo pra esse teste:

OBS: alterei seu codigo para funcionar com inteiros, caso eu tenha cometido algum equivoco ou deserrumado algo sem querer me avise :wink:

public class Teste&#123;
 public static void main&#40;String args&#91;&#93;&#41;&#123;
  long ms;
  int array&#91;&#93;, copia&#91;&#93; = geraArray&#40;100000&#41;;
  array = new int&#91;copia.length&#93;;
  copia&#40;array, copia&#41;;
  ms = System.currentTimeMillis&#40;&#41;;
  quicksort&#40;0, array.length - 1, array&#41;;
  System.out.println&#40;&quot;Quicksort&#58; &quot; + &#40;System.currentTimeMillis&#40;&#41; - ms&#41;&#41;;
  copia&#40;array, copia&#41;;
  ms = System.currentTimeMillis&#40;&#41;;
  bubble&#40;array&#41;;
  System.out.println&#40;&quot;Bubble&#58; &quot; + &#40;System.currentTimeMillis&#40;&#41; - ms&#41;&#41;;
 &#125;
 public static void copia&#40;int array&#91;&#93;, int copia&#91;&#93;&#41;&#123;
  for &#40;int i = 0; i &lt; array.length; i++&#41;&#123;
   array&#91;i&#93; = copia&#91;i&#93;;
  &#125;
 &#125;
 public static int&#91;&#93; geraArray&#40;int size&#41;&#123;
  int array&#91;&#93; = new int&#91;size&#93;;
  for &#40;int i = 0; i &lt; size; i++&#41;&#123;
   array&#91;i&#93; = &#40;int&#41;&#40;Math.random&#40;&#41; * size&#41;;
  &#125;
  return array;
 &#125;
 public static void quicksort&#40;int p, int q, int array&#91;&#93;&#41;&#123;
 if &#40;p &lt; q&#41;&#123;
  int j = p - 1;
  int aux = array&#91;q&#93;;
  for &#40;int i = p; i &lt;= q; i++&#41;&#123;
   if &#40;array&#91;i&#93; &lt;= aux&#41;&#123;
    int aux2 = array&#91;i&#93;;
    array&#91;i&#93; = array&#91;++j&#93;;
    array&#91;j&#93; = aux2;
   &#125;
  &#125;
  quicksort&#40;p, j - 1, array&#41;;
  quicksort&#40;j + 1, q, array&#41;;
 &#125;
&#125; 
 public static int&#91;&#93; bubble&#40;int&#91;&#93; intArray&#41;&#123;
        int   cur = 0;
        int limit = intArray.length - 1;
        int start = 0;
        while&#40;start &lt; limit&#41; &#123;
            for&#40;cur = start; cur &lt; limit; cur++&#41; &#123;
                if&#40;intArray&#91;cur&#93; &gt; intArray&#91;cur + 1&#93;&#41; &#123;
                    int tempValue  = intArray&#91;cur&#93;;
                    intArray&#91;cur&#93;     = intArray&#91;cur + 1&#93;;
                    intArray&#91;cur + 1&#93; = tempValue;
                &#125;
            &#125;
            for&#40;cur = limit; --cur &gt;= start;&#41; &#123;
                if&#40;intArray&#91;cur&#93; &gt; intArray&#91;cur + 1&#93;&#41; &#123;
                    int tempValue = intArray&#91;cur&#93;;
                    intArray&#91;cur&#93;      = intArray&#91;cur + 1&#93;;
                    intArray&#91;cur + 1&#93;  = tempValue;
                &#125;
            &#125;
            start++;
            limit--;
        &#125;
        return intArray;
    &#125; 
&#125;

outra observacao, vc n precisa retornar o array, pois os arrays sao passados por referencia, entaum as modificacoes feitas no metodo vao afetar o array original (por isso q eh feita uma copia)…

qndo estavamos comparando strings a diferenca era pequena (e o bublesort chegava a ser mais rapido), pq alem de estarmos usando arrays muito pequenos (onde ainda assim o quicksort eh mais rapido, a nao ser claro se for um array de 1 ou 2 elementos), vc estava comparando apenas o primeiro caractere, como eu jah disse inumeras vezes, vc tb pode comparar apenas o primeiro caractere usando o quicksort, vai ficar ainda mais rapido, mas eu aconcelho suar o metodo compareTo que compara as strings ateh achar qual eh a q vem antes…[/quote]

Eu ja desencanei do bubble, estou brincando com o meu proprio =]

Tive duas ideias, um vou chamar de chunk sorting e o outro sei la do que…

Organizando um array de int de 10 caracteres, o meu metodo esta 3x mais rapido que o quicksort por enquanto =]
Mas nao esta ordenando direito (bugs)…
A outra versao que pretendo fazer (o chunk sorting), nao sei por que, mas acho que ele vai usar o mesmo esquema do Shear Sort…sei la (vendo o applet deles funcionando, da impressao que o que é feito é a mesma coisa que pensei…mas acho que foi subconsciente, por que so pensei depois de ver :P)…

E sobre retornar o array, isso é verdade, MASSSSSSS

Fica muito feio algo como

String [] arr = new String[] {“abc”, “def”, “ghi”}.
sort(arr);

arr = Util.sort(arr); fica mais elegante e mais orientado a objeto, alem de ser padrao (todos os outros metodos retornariam algo…)…

E em termos de performance nao acho que faca diferenca, ja que retorna a referencia que ja tenho… :slight_smile:

posta ai o codigo q vc ta fazendo… agora fiquei curioso ehhehehehe e qm sabe posso te ajudar a arrumar os bugs :wink:

Eu já devo ter perdido umas 2 horas nele…
A idéia é meio que sei lá, como se fosse um bubble feito em pequenos pedaços, ligados por elos (mas não é esse o que chamarei de chunk hehe, o de chunk vai ser meio que por estatistica de numero, pra determinar em que lugar do array deve ir o numero e etc)…

Seria algo como

9023157468

Na vertical =

9
0
2
3
1
5
7
4
6
8

Tipo, vou tentar mostrar o que deve acontecer (e no programa eu tinha comecado a imprimir na tela pra ver o que acontece…vou identar usando — aqui)

0
2
3
9 — 1
----- 5
----- 7
----- 9 — 4
----------- 6
----------- 8
----------- 9

isso vai ficar

0
2
3
1
5
7
4
6
8
9

Essa é a primeira iteração (com as sub-iteracoes)…ai vem a segunda, comecando do seguro caractere:

0
1
2
3
5 — 4
----- 5
----- 6
----- 7 — 8
----------- 9

E fica 0123456789

Já foi ordenada completamente na segunda iteracao, mas caso nao fosse, seria ordenado no máximo na quarta, que é quando fecharia o elo dos caracteres (tipo, o primeiro comeca do primeiro caractere, depois comeca do segundo, depois do terceiro, depois faz uma ultima rodada com o primeiro)…

É isso hehe aí esta o codigo =)

public static void bubble&#40;char &#91;&#93; chrArr&#41; &#123;
    int     cur = 0; 
    int   count = chrArr.length;
    // usado como 4 apenas pra testes, deve ser determinado automaticamente
    int divisor = 4;
    int   loops = &#40;int&#41; Math.ceil&#40;count / &#40;double&#41; divisor&#41;;
    // loop principal do pedaco
    System.out.println&#40;&quot;Len&#58; &quot; + count + &quot;, &quot; + &quot;Loops&#58; &quot; + loops&#41;;
    for&#40;int w = 0; w &lt; loops; w++&#41; &#123;
        int str = &#40;&#40;w + 1&#41; * divisor&#41; - 4 - &#40;1 * w&#41;;
        int end = str + 3;
        System.out.println&#40;&quot;Loop principal&#58; &quot; + str + &quot; a &quot; + end&#41;;
        // loop para comparar cada caractere do chunk
        for&#40;int x = 0; x &lt; 3; x++&#41; &#123;
            // sum = indice do caractere do chunk
            int  sum = w + x;
            // caractere sendo comparado
            char chr = chrArr&#91;sum&#93;;
            // indice atual do caractere
            int  idx = sum;
            System.out.println&#40;&quot;\t&quot; + sum + &quot;,&quot; + chr&#41;;
            for&#40;int y = 0; y &lt; 3; y++&#41; &#123;
                char nxt = chrArr&#91;w + y&#93;;
                if&#40;chr &gt; nxt&#41; &#123;
                    idx = y;
                &#125;
            &#125;
            if&#40;idx != sum&#41; &#123;
                chrArr&#91;sum&#93; = chrArr&#91;idx&#93;;
                chrArr&#91;idx&#93; = chr;
            &#125;
        &#125;
    &#125;
    for&#40;int x = 0; x &lt; chrArr.length; x++&#41; &#123;
        System.out.print&#40;chrArr&#91;x&#93; + &quot; &quot;&#41;;
    &#125;
    System.exit&#40;0&#41;;
&#125; 

qnto ao site da sun q falava sobre os metodos de ordenacao, eu dei uma olhada, e fiz um testezinho basico (jah aproveitei pra por o insertionsort junto no teste), pelo que eu vi lah, o quicksort deles estava diferente do q eu uso, e pior, eu testei o deles e caiu em um loop infinito (bem, pelo menos tava demorando uns 30 sec pra organizar um array de 10 elementos hehehehe), e por isso fiz o teste com o quicksort q eu uso, pelos meus testes, o quicksort eh MUITO mais rapido q o shearsort… vejam o resultado:

OBS: a JVM soh libera 64MB de memoria, por isso qndo fui usar 10000000 elementos a memoria esgotou… mas notem a GRANDE diferenca, enquanto o shearsort levou mais de 10 minutos, enquanto o quicksort n levou nem meio segundo (os outros eu “travei” pq se n iam demorar muito hehehehe, o shearsort eu ia travar depois desse, se n tivesse o problema da memoria, e veria ateh onde o quicksort vai)

bem, com esse teste vi uma coisa: o quicksort faz juz ao “quick” que leva no nome :grin:

segue o codigo (ta compridinho):

public class Teste&#123;
 public static void main&#40;String args&#91;&#93;&#41;&#123;
  long ms;
  int array&#91;&#93;, copia&#91;&#93;;
  for &#40;int i = 0; i &lt; 8; i++&#41;&#123;
   copia = geraArray&#40;&#40;int&#41;Math.pow&#40;10, i&#41;&#41;;
   array = new int&#91;copia.length&#93;;
   System.out.println&#40;&quot;NUMERO DE ELEMENTOS&#58; &quot; + array.length&#41;;
   copia&#40;array, copia&#41;;
   if &#40;i &lt; 6&#41;&#123;
    ms = System.currentTimeMillis&#40;&#41;;
    bubblesort&#40;array&#41;;
    System.out.println&#40;&quot;BubbleSort&#58; &quot; + &#40;System.currentTimeMillis&#40;&#41; - ms&#41;&#41;;
    copia&#40;array, copia&#41;;
    ms = System.currentTimeMillis&#40;&#41;;
    oddevensort&#40;array&#41;;
    System.out.println&#40;&quot;OddEvenSort&#58; &quot; + &#40;System.currentTimeMillis&#40;&#41; - ms&#41;&#41;;
    copia&#40;array, copia&#41;;
    ms = System.currentTimeMillis&#40;&#41;;
    insertionsort&#40;array&#41;;
    System.out.println&#40;&quot;InsertionSort&#58; &quot; + &#40;System.currentTimeMillis&#40;&#41; - ms&#41;&#41;;
    copia&#40;array, copia&#41;;
   &#125;
   else&#123;
    System.out.println&#40;&quot;BubbleSort&#58; um monte&quot;&#41;;
    System.out.println&#40;&quot;OddEvenSort&#58; um monte&quot;&#41;;
    System.out.println&#40;&quot;InsertionSort&#58; um monte&quot;&#41;;
   &#125;
   if &#40;i &lt; 7&#41;&#123;
    ms = System.currentTimeMillis&#40;&#41;;
    shearsort&#40;array&#41;;
    System.out.println&#40;&quot;ShearSort&#58; &quot; + &#40;System.currentTimeMillis&#40;&#41; - ms&#41;&#41;;
    copia&#40;array, copia&#41;;
   &#125;
   else System.out.println&#40;&quot;ShearSort&#58; um monte&quot;&#41;;
   ms = System.currentTimeMillis&#40;&#41;;
   quicksort&#40;0, array.length - 1, array&#41;;
   System.out.println&#40;&quot;QuickSort&#58; &quot; + &#40;System.currentTimeMillis&#40;&#41; - ms&#41;&#41;;
   System.out.println&#40;&#41;;
  &#125;
 &#125;
 public static void copia&#40;int array&#91;&#93;, int copia&#91;&#93;&#41;&#123;
  for &#40;int i = 0; i &lt; array.length; i++&#41;&#123;
   array&#91;i&#93; = copia&#91;i&#93;;
  &#125;
 &#125;
 public static int&#91;&#93; geraArray&#40;int size&#41;&#123;
  int array&#91;&#93; = new int&#91;size&#93;;
  for &#40;int i = 0; i &lt; size; i++&#41;&#123;
   array&#91;i&#93; = &#40;int&#41;&#40;Math.random&#40;&#41; * size&#41;;
  &#125;
  return array;
 &#125;
 public static void insertionsort&#40;int array&#91;&#93;&#41;&#123;
  int h, aux;
  for &#40;int i = 1; i &lt; array.length; i++&#41;&#123;
   h = i - 1;
   aux = array&#91;i&#93;;
   while &#40;h &gt;= 0 &amp;&amp; aux &lt; array&#91;h&#93;&#41;&#123;
    int aux2 = array&#91;h&#93;;
    array&#91;h&#93; = array&#91;h + 1&#93;;
    array&#91;h + 1&#93; = aux2;
    h--;
   &#125;
  &#125;
 &#125;
 static void oddevensort&#40;int a&#91;&#93;&#41;&#123;
	for &#40;int i = 0; i &lt; a.length/2; i++ &#41; &#123;
		for &#40;int j = 0; j+1 &lt; a.length; j += 2&#41; 
		    if &#40;a&#91;j&#93; &gt; a&#91;j+1&#93;&#41; &#123;
		        int T = a&#91;j&#93;;
		        a&#91;j&#93; = a&#91;j+1&#93;;
		        a&#91;j+1&#93; = T;
		    &#125;
		for &#40;int j = 1; j+1 &lt; a.length; j += 2&#41; 
		    if &#40;a&#91;j&#93; &gt; a&#91;j+1&#93;&#41; &#123;
		        int T = a&#91;j&#93;;
		        a&#91;j&#93; = a&#91;j+1&#93;;
		        a&#91;j+1&#93; = T;
		    &#125;
	&#125;	
    &#125;
 public static void quicksort&#40;int p, int q, int array&#91;&#93;&#41;&#123;
  if &#40;p &lt; q&#41;&#123;
   int j = p - 1;
   int aux = array&#91;q&#93;;
   for &#40;int i = p; i &lt;= q; i++&#41;&#123;
    if &#40;array&#91;i&#93; &lt;= aux&#41;&#123;
     int aux2 = array&#91;i&#93;;
     array&#91;i&#93; = array&#91;++j&#93;;
     array&#91;j&#93; = aux2;
    &#125;
   &#125;
   quicksort&#40;p, j - 1, array&#41;;
   quicksort&#40;j + 1, q, array&#41;;
  &#125;
 &#125; 
 public static void bubblesort&#40;int&#91;&#93; array&#41;&#123;
  for &#40;int i = array.length; --i &gt;= 0;&#41;&#123;
   for &#40;int j = 0; j &lt; i; j++&#41;&#123;
    if &#40;array&#91;j&#93; &gt; array&#91;j + 1&#93;&#41;&#123;
     int aux = array&#91;j&#93;;
     array&#91;j&#93; = array&#91;j + 1&#93;;
     array&#91;j + 1&#93; = aux;
    &#125;
   &#125;
  &#125;
 &#125;
 private static int Log, Rows, Cols;
    static void shearsort&#40;int a&#91;&#93;&#41;&#123;
	int pow=1, div=1;
	int h&#91;&#93;;

	for&#40;int i=1; i*i&lt;=a.length; i++&#41; 
	    if &#40;a.length % i == 0&#41; div = i;
	Rows = div; Cols = a.length / div;
	for&#40;Log=0; pow&lt;=Rows; Log++&#41; 
	    pow = pow * 2;

	h = new int&#91;Rows&#93;;
	for &#40;int i=0; i&lt;Rows; i++&#41;
	    h&#91;i&#93;=i*Cols;

	for &#40;int k=0; k&lt;Log; k++&#41; &#123;
	    for &#40;int j=0; j&lt;Cols/2; j++&#41; &#123;
		for &#40;int i=0; i&lt;Rows; i++&#41;
	            sortPart1&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,&#40;i%2==0?true&#58;false&#41;&#41;;
		for &#40;int i=0; i&lt;Rows; i++&#41;
	            sortPart2&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,&#40;i%2==0?true&#58;false&#41;&#41;;
	    &#125;
	    for &#40;int j=0; j&lt;Rows/2; j++&#41; &#123;
		for &#40;int i=0; i&lt;Cols; i++&#41;
	            sortPart1&#40;a,i,Rows*Cols+i,Cols,true&#41;;
		for &#40;int i=0; i&lt;Cols; i++&#41;
	            sortPart2&#40;a,i,Rows*Cols+i,Cols,true&#41;;
	    &#125;
	&#125;
	for &#40;int j=0; j&lt;Cols/2; j++&#41; &#123;
	    for &#40;int i=0; i&lt;Rows; i++&#41;
	        sortPart1&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,true&#41;;
	    for &#40;int i=0; i&lt;Rows; i++&#41;
	        sortPart2&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,true&#41;;
	&#125;
	for &#40;int i=0; i&lt;Rows; i++&#41;
	    h&#91;i&#93;=-1;
    &#125;

    private static void sortPart1&#40;int a&#91;&#93;, int Lo, int Hi, int Nx, boolean Up&#41;&#123;
	    for &#40;int j = Lo; j+Nx&lt;Hi; j+=2*Nx&#41; 
		if &#40;&#40;Up &amp;&amp; a&#91;j&#93; &gt; a&#91;j+Nx&#93;&#41; || !Up &amp;&amp; a&#91;j&#93; &lt; a&#91;j+Nx&#93;&#41; &#123;
		    int T = a&#91;j&#93;;
		    a&#91;j&#93; = a&#91;j+Nx&#93;;
		    a&#91;j+Nx&#93; = T;
		&#125;
    &#125;

    private static void sortPart2&#40;int a&#91;&#93;, int Lo, int Hi, int Nx, boolean Up&#41;&#123;
	    for &#40;int j = Lo+Nx; j+Nx&lt;Hi; j+=2*Nx&#41; 
		if &#40;&#40;Up &amp;&amp; a&#91;j&#93; &gt; a&#91;j+Nx&#93;&#41; || !Up &amp;&amp; a&#91;j&#93; &lt; a&#91;j+Nx&#93;&#41; &#123;
		    int T = a&#91;j&#93;;
		    a&#91;j&#93; = a&#91;j+Nx&#93;;
		    a&#91;j+Nx&#93; = T;
		&#125;
    &#125;
&#125;

[quote=“Felipe”]qnto ao site da sun q falava sobre os metodos de ordenacao, eu dei uma olhada, e fiz um testezinho basico (jah aproveitei pra por o insertionsort junto no teste), pelo que eu vi lah, o quicksort deles estava diferente do q eu uso, e pior, eu testei o deles e caiu em um loop infinito (bem, pelo menos tava demorando uns 30 sec pra organizar um array de 10 elementos hehehehe), e por isso fiz o teste com o quicksort q eu uso, pelos meus testes, o quicksort eh MUITO mais rapido q o shearsort… vejam o resultado:

OBS: a JVM soh libera 64MB de memoria, por isso qndo fui usar 10000000 elementos a memoria esgotou… mas notem a GRANDE diferenca, enquanto o shearsort levou mais de 10 minutos, enquanto o quicksort n levou nem meio segundo (os outros eu “travei” pq se n iam demorar muito hehehehe, o shearsort eu ia travar depois desse, se n tivesse o problema da memoria, e veria ateh onde o quicksort vai)

bem, com esse teste vi uma coisa: o quicksort faz juz ao “quick” que leva no nome :grin:

segue o codigo (ta compridinho):

[code]
public class Teste{
public static void main(String args[]){
long ms;
int array[], copia[];
for (int i = 0; i < 8; i++){
copia = geraArray((int)Math.pow(10, i));
array = new int[copia.length];
System.out.println("NUMERO DE ELEMENTOS: " + array.length);
copia(array, copia);
if (i < 6){
ms = System.currentTimeMillis();
bubblesort(array);
System.out.println("BubbleSort: " + (System.currentTimeMillis() - ms));
copia(array, copia);
ms = System.currentTimeMillis();
oddevensort(array);
System.out.println("OddEvenSort: " + (System.currentTimeMillis() - ms));
copia(array, copia);
ms = System.currentTimeMillis();
insertionsort(array);
System.out.println("InsertionSort: " + (System.currentTimeMillis() - ms));
copia(array, copia);
}
else{
System.out.println("BubbleSort: um monte");
System.out.println("OddEvenSort: um monte");
System.out.println("InsertionSort: um monte");
}
if (i < 7){
ms = System.currentTimeMillis();
shearsort(array);
System.out.println("ShearSort: " + (System.currentTimeMillis() - ms));
copia(array, copia);
}
else System.out.println("ShearSort: um monte");
ms = System.currentTimeMillis();
quicksort(0, array.length - 1, array);
System.out.println("QuickSort: " + (System.currentTimeMillis() - ms));
System.out.println();
}
}
public static void copia(int array[], int copia[]){
for (int i = 0; i < array.length; i++){
array[i] = copia[i];
}
}
public static int[] geraArray(int size){
int array[] = new int[size];
for (int i = 0; i < size; i++){
array[i] = (int)(Math.random() * size);
}
return array;
}
public static void insertionsort(int array[]){
int h, aux;
for (int i = 1; i < array.length; i++){
h = i - 1;
aux = array[i];
while (h >= 0 && aux < array[h]){
int aux2 = array[h];
array[h] = array[h + 1];
array[h + 1] = aux2;
h–;
}
}
}
static void oddevensort(int a[]){
for (int i = 0; i < a.length/2; i++ ) {
for (int j = 0; j+1 < a.length; j += 2)
if (a[j] > a[j+1]) {
int T = a[j];
a[j] = a[j+1];
a[j+1] = T;
}
for (int j = 1; j+1 < a.length; j += 2)
if (a[j] > a[j+1]) {
int T = a[j];
a[j] = a[j+1];
a[j+1] = T;
}
}
}
public static void quicksort(int p, int q, int array[]){
if (p < q){
int j = p - 1;
int aux = array[q];
for (int i = p; i <= q; i++){
if (array[i] <= aux){
int aux2 = array[i];
array[i] = array[++j];
array[j] = aux2;
}
}
quicksort(p, j - 1, array);
quicksort(j + 1, q, array);
}
}
public static void bubblesort(int[] array){
for (int i = array.length; --i >= 0;){
for (int j = 0; j < i; j++){
if (array[j] > array[j + 1]){
int aux = array[j];
array[j] = array[j + 1];
array[j + 1] = aux;
}
}
}
}
private static int Log, Rows, Cols;
static void shearsort(int a[]){
int pow=1, div=1;
int h[];

for&#40;int i=1; i*i&lt;=a.length; i++&#41; 
    if &#40;a.length % i == 0&#41; div = i;
Rows = div; Cols = a.length / div;
for&#40;Log=0; pow&lt;=Rows; Log++&#41; 
    pow = pow * 2;

h = new int&#91;Rows&#93;;
for &#40;int i=0; i&lt;Rows; i++&#41;
    h&#91;i&#93;=i*Cols;

for &#40;int k=0; k&lt;Log; k++&#41; &#123;
    for &#40;int j=0; j&lt;Cols/2; j++&#41; &#123;
	for &#40;int i=0; i&lt;Rows; i++&#41;
            sortPart1&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,&#40;i%2==0?true&#58;false&#41;&#41;;
	for &#40;int i=0; i&lt;Rows; i++&#41;
            sortPart2&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,&#40;i%2==0?true&#58;false&#41;&#41;;
    &#125;
    for &#40;int j=0; j&lt;Rows/2; j++&#41; &#123;
	for &#40;int i=0; i&lt;Cols; i++&#41;
            sortPart1&#40;a,i,Rows*Cols+i,Cols,true&#41;;
	for &#40;int i=0; i&lt;Cols; i++&#41;
            sortPart2&#40;a,i,Rows*Cols+i,Cols,true&#41;;
    &#125;
&#125;
for &#40;int j=0; j&lt;Cols/2; j++&#41; &#123;
    for &#40;int i=0; i&lt;Rows; i++&#41;
        sortPart1&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,true&#41;;
    for &#40;int i=0; i&lt;Rows; i++&#41;
        sortPart2&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,true&#41;;
&#125;
for &#40;int i=0; i&lt;Rows; i++&#41;
    h&#91;i&#93;=-1;
&#125;

private static void sortPart1&#40;int a&#91;&#93;, int Lo, int Hi, int Nx, boolean Up&#41;&#123;
    for &#40;int j = Lo; j+Nx&lt;Hi; j+=2*Nx&#41; 
	if &#40;&#40;Up &amp;&amp; a&#91;j&#93; &gt; a&#91;j+Nx&#93;&#41; || !Up &amp;&amp; a&#91;j&#93; &lt; a&#91;j+Nx&#93;&#41; &#123;
	    int T = a&#91;j&#93;;
	    a&#91;j&#93; = a&#91;j+Nx&#93;;
	    a&#91;j+Nx&#93; = T;
	&#125;
&#125;

private static void sortPart2&#40;int a&#91;&#93;, int Lo, int Hi, int Nx, boolean Up&#41;&#123;
    for &#40;int j = Lo+Nx; j+Nx&lt;Hi; j+=2*Nx&#41; 
	if &#40;&#40;Up &amp;&amp; a&#91;j&#93; &gt; a&#91;j+Nx&#93;&#41; || !Up &amp;&amp; a&#91;j&#93; &lt; a&#91;j+Nx&#93;&#41; &#123;
	    int T = a&#91;j&#93;;
	    a&#91;j&#93; = a&#91;j+Nx&#93;;
	    a&#91;j+Nx&#93; = T;
	&#125;
&#125;

}
[/code][/quote]

Poe o mesmo valor em todos (ao inves de Math.random() ) e o seu quicksort esta dando stack overflow :stuck_out_tongue:

[quote=“mavi”][quote=“Felipe”]qnto ao site da sun q falava sobre os metodos de ordenacao, eu dei uma olhada, e fiz um testezinho basico (jah aproveitei pra por o insertionsort junto no teste), pelo que eu vi lah, o quicksort deles estava diferente do q eu uso, e pior, eu testei o deles e caiu em um loop infinito (bem, pelo menos tava demorando uns 30 sec pra organizar um array de 10 elementos hehehehe), e por isso fiz o teste com o quicksort q eu uso, pelos meus testes, o quicksort eh MUITO mais rapido q o shearsort… vejam o resultado:

OBS: a JVM soh libera 64MB de memoria, por isso qndo fui usar 10000000 elementos a memoria esgotou… mas notem a GRANDE diferenca, enquanto o shearsort levou mais de 10 minutos, enquanto o quicksort n levou nem meio segundo (os outros eu “travei” pq se n iam demorar muito hehehehe, o shearsort eu ia travar depois desse, se n tivesse o problema da memoria, e veria ateh onde o quicksort vai)

bem, com esse teste vi uma coisa: o quicksort faz juz ao “quick” que leva no nome :grin:

segue o codigo (ta compridinho):

[code]
public class Teste{
public static void main(String args[]){
long ms;
int array[], copia[];
for (int i = 0; i < 8; i++){
copia = geraArray((int)Math.pow(10, i));
array = new int[copia.length];
System.out.println("NUMERO DE ELEMENTOS: " + array.length);
copia(array, copia);
if (i < 6){
ms = System.currentTimeMillis();
bubblesort(array);
System.out.println("BubbleSort: " + (System.currentTimeMillis() - ms));
copia(array, copia);
ms = System.currentTimeMillis();
oddevensort(array);
System.out.println("OddEvenSort: " + (System.currentTimeMillis() - ms));
copia(array, copia);
ms = System.currentTimeMillis();
insertionsort(array);
System.out.println("InsertionSort: " + (System.currentTimeMillis() - ms));
copia(array, copia);
}
else{
System.out.println("BubbleSort: um monte");
System.out.println("OddEvenSort: um monte");
System.out.println("InsertionSort: um monte");
}
if (i < 7){
ms = System.currentTimeMillis();
shearsort(array);
System.out.println("ShearSort: " + (System.currentTimeMillis() - ms));
copia(array, copia);
}
else System.out.println("ShearSort: um monte");
ms = System.currentTimeMillis();
quicksort(0, array.length - 1, array);
System.out.println("QuickSort: " + (System.currentTimeMillis() - ms));
System.out.println();
}
}
public static void copia(int array[], int copia[]){
for (int i = 0; i < array.length; i++){
array[i] = copia[i];
}
}
public static int[] geraArray(int size){
int array[] = new int[size];
for (int i = 0; i < size; i++){
array[i] = (int)(Math.random() * size);
}
return array;
}
public static void insertionsort(int array[]){
int h, aux;
for (int i = 1; i < array.length; i++){
h = i - 1;
aux = array[i];
while (h >= 0 && aux < array[h]){
int aux2 = array[h];
array[h] = array[h + 1];
array[h + 1] = aux2;
h–;
}
}
}
static void oddevensort(int a[]){
for (int i = 0; i < a.length/2; i++ ) {
for (int j = 0; j+1 < a.length; j += 2)
if (a[j] > a[j+1]) {
int T = a[j];
a[j] = a[j+1];
a[j+1] = T;
}
for (int j = 1; j+1 < a.length; j += 2)
if (a[j] > a[j+1]) {
int T = a[j];
a[j] = a[j+1];
a[j+1] = T;
}
}
}
public static void quicksort(int p, int q, int array[]){
if (p < q){
int j = p - 1;
int aux = array[q];
for (int i = p; i <= q; i++){
if (array[i] <= aux){
int aux2 = array[i];
array[i] = array[++j];
array[j] = aux2;
}
}
quicksort(p, j - 1, array);
quicksort(j + 1, q, array);
}
}
public static void bubblesort(int[] array){
for (int i = array.length; --i >= 0;){
for (int j = 0; j < i; j++){
if (array[j] > array[j + 1]){
int aux = array[j];
array[j] = array[j + 1];
array[j + 1] = aux;
}
}
}
}
private static int Log, Rows, Cols;
static void shearsort(int a[]){
int pow=1, div=1;
int h[];

for&#40;int i=1; i*i&lt;=a.length; i++&#41; 
    if &#40;a.length % i == 0&#41; div = i;
Rows = div; Cols = a.length / div;
for&#40;Log=0; pow&lt;=Rows; Log++&#41; 
    pow = pow * 2;

h = new int&#91;Rows&#93;;
for &#40;int i=0; i&lt;Rows; i++&#41;
    h&#91;i&#93;=i*Cols;

for &#40;int k=0; k&lt;Log; k++&#41; &#123;
    for &#40;int j=0; j&lt;Cols/2; j++&#41; &#123;
	for &#40;int i=0; i&lt;Rows; i++&#41;
            sortPart1&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,&#40;i%2==0?true&#58;false&#41;&#41;;
	for &#40;int i=0; i&lt;Rows; i++&#41;
            sortPart2&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,&#40;i%2==0?true&#58;false&#41;&#41;;
    &#125;
    for &#40;int j=0; j&lt;Rows/2; j++&#41; &#123;
	for &#40;int i=0; i&lt;Cols; i++&#41;
            sortPart1&#40;a,i,Rows*Cols+i,Cols,true&#41;;
	for &#40;int i=0; i&lt;Cols; i++&#41;
            sortPart2&#40;a,i,Rows*Cols+i,Cols,true&#41;;
    &#125;
&#125;
for &#40;int j=0; j&lt;Cols/2; j++&#41; &#123;
    for &#40;int i=0; i&lt;Rows; i++&#41;
        sortPart1&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,true&#41;;
    for &#40;int i=0; i&lt;Rows; i++&#41;
        sortPart2&#40;a,i*Cols,&#40;i+1&#41;*Cols,1,true&#41;;
&#125;
for &#40;int i=0; i&lt;Rows; i++&#41;
    h&#91;i&#93;=-1;
&#125;

private static void sortPart1&#40;int a&#91;&#93;, int Lo, int Hi, int Nx, boolean Up&#41;&#123;
    for &#40;int j = Lo; j+Nx&lt;Hi; j+=2*Nx&#41; 
	if &#40;&#40;Up &amp;&amp; a&#91;j&#93; &gt; a&#91;j+Nx&#93;&#41; || !Up &amp;&amp; a&#91;j&#93; &lt; a&#91;j+Nx&#93;&#41; &#123;
	    int T = a&#91;j&#93;;
	    a&#91;j&#93; = a&#91;j+Nx&#93;;
	    a&#91;j+Nx&#93; = T;
	&#125;
&#125;

private static void sortPart2&#40;int a&#91;&#93;, int Lo, int Hi, int Nx, boolean Up&#41;&#123;
    for &#40;int j = Lo+Nx; j+Nx&lt;Hi; j+=2*Nx&#41; 
	if &#40;&#40;Up &amp;&amp; a&#91;j&#93; &gt; a&#91;j+Nx&#93;&#41; || !Up &amp;&amp; a&#91;j&#93; &lt; a&#91;j+Nx&#93;&#41; &#123;
	    int T = a&#91;j&#93;;
	    a&#91;j&#93; = a&#91;j+Nx&#93;;
	    a&#91;j+Nx&#93; = T;
	&#125;
&#125;

}
[/code][/quote]

Poe o mesmo valor em todos (ao inves de Math.random() ) e o seu quicksort esta dando stack overflow :P[/quote]

PS: voce pode usar o System.arraycopy para copiar o array (sem ter que ficar gerando e percorrendo ele).