Estou tentando usar o método Quick sort mais não estou conseguindo alguém pode me da uma dica de como eu faço para passar parâmentros pro método,
que o método recebe e o seguinte
privatestaticvoidordena(inta[],intp,intu)
o primeiro e o vetor e esse p e u o que é isso???
vo deixar o código aqui embaixo quem souber por favor implemente ou me da uma dica de como passar esses parâmetros
importjavax.swing.JOptionPane;publicclassQuick{/*----------------------------------------------------------------------*//* Ordena uma rray pelo método QuickSort (recursivo). *//* Escolhe o pivô da partição aleatoriamente para minimizar proba- *//* bilidade de tamanhos muito diferentes das duas metades do ARRAY. *//* Rearranja o array de tal modo que: *//* Elementos da primeira metade sejam menores que o pivô *//* Elementos da segunda metade sejam maiores que o pivô *//* Parâmetros: array, índices do início e fim do subarray. *//*----------------------------------------------------------------------*/privatestaticvoidordena(inta[],intp,intu){inti=p,f=u;// Extremosintx=(int)(Math.random()*(u-p+1))+p;// Aleatóriointpivô=a[x];// para evitar quadráticowhile(i<=f){// Enquanto não se cruzaremwhile(i<u&&a[i]<pivô)i++;// Organiza primeira metadewhile(f>p&&a[f]>pivô)f--;// Organiza segunda metadeif(i<=f){// Se ainda não acaboux=a[f];// troca os elementosa[f--]=a[i];// dos dois ladosa[i++]=x;// da lista}}if(p<f)ordena(a,p,f);// a[p]..a[f] < pivôif(i<u)ordena(a,i,u);// a[i]..a[u] > pivô}publicstaticvoidmain(Stringargs[]){intvet[]=newint[10];inti;for(i=0;i<vet.length;i++){vet[i]=Integer.parseInt(JOptionPane.showInputDialog("Dígite o "+(i+1)+"° número"));ordena(vet);}}/*----------------------------------------------------------------------*//* Chamada do usuário (mesma para todos os algoritmos). *//*----------------------------------------------------------------------*/}
lá tem vários exemplos… e se ainda não conseguir… tente mais uma vez e depois peça ajuda ae \o\
edymrex
Já procurei cara e muito complexo a versão que está no site http://pt.wikipedia.org/wiki/Quick_sort e mais complexa ainda difícil de enteder se alguém souber me fale qual a estrategia que o método
usa para ordernar o vetor porque já desisti de tentar aprender como ele funciona…
maikonaraujo
O u e o p são os extremos do array que vc deseja ordenar, e.g.:
int[]a=newint[10];// u = 0 e p=9 ordena todo o array,// u = 0 e p = 4 ordena apenas a primeira metade
ele utiliza estes parametros para ficar alterando a parte do array durante as chamdas recursivas.
PS.: O comentário do método que vc mesmo postou explica bem a idéia do quick sort. Vc escolhe um elemento pivot e posiciona ele de forma q todos a esquerda sejam menores q ele e todos a direita sejam maiore, desta forma o elemento esta na sua posição correta, ai vc aplica isto recursivamente a lista da esquerda e da direita.
[]´s
edymrex
Beleza cara, mas a escolha do pivô e aleatória ou a o primeiro índice do vetor?
A idéia que eu tenho e exatamente isso que você disse, ele escolhe um pivô,
Os elementos <= ao pivô ficam a esquerda dele os valores >= ficam a sua direita certa mais na escolha do pivô como é feita cara…? Se for o array no índice 0 como ele vai pegar os valores a esquerda do array isso que eu não entendo dei uma arrumada no código para ficar mais fácil o entendimento da minha pergunta.
importjavax.swing.JOptionPane;importjavax.swing.JTextArea;publicclassQuick{/*----------------------------------------------------------------------*//* Ordena uma array pelo método QuickSort (recursivo). *//* Escolhe o pivô da partição aleatoriamente para minimizar proba- *//* bilidade de tamanhos muito diferentes das duas metades do ARRAY. *//* Rearranja o array de tal modo que: *//* Elementos da primeira metade sejam menores que o pivô *//* Elementos da segunda metade sejam maiores que o pivô *//* Parâmetros: array, índices do início e fim do subarray. *//*----------------------------------------------------------------------*/privatestaticvoidordena(inta[],intp,intu){inti=p,f=u;// Extremosintx=(int)(Math.random()*(u-p+1))+p;// Aleatóriointpivô=a[x];// para evitar quadráticowhile(i<=f)// Enquanto não se cruzarem{while(i<u&&a[i]<pivô)i++;// Organiza primeira metadewhile(f>p&&a[f]>pivô)f--;// Organiza segunda metadeif(i<=f){// Se ainda não acaboux=a[f];// troca os elementosa[f--]=a[i];// dos dois ladosa[i++]=x;// da lista}}if(p<f)ordena(a,p,f);// a[p]..a[f] < pivôif(i<u)ordena(a,i,u);// a[i]..a[u] > pivô}publicstaticvoidmain(Stringargs[]){Stringsaida="";JTextAreatexto=newJTextArea(10,10);intvet[]=newint[10];inti;for(i=0;i<vet.length;i++){vet[i]=Integer.parseInt(JOptionPane.showInputDialog(null,"Dígite o "+(i+1)+"° número","ATENÇÂO",JOptionPane.WARNING_MESSAGE));}ordena(vet,0,vet.length-1);//********************for(i=0;i<vet.length;i++){saida+=vet[i]+"\n";}texto.setText(saida);JOptionPane.showMessageDialog(null,texto,"ORDENAÇÂO COM QUICK SORT",JOptionPane.WARNING_MESSAGE);}/*----------------------------------------------------------------------*//* Chamada do usuário (mesma para todos os algoritmos). * public static void ordena(int a[]) {ordena(a,0,a.length-1);} *//*----------------------------------------------------------------------*/}
Essa parte também não entendi
O que ela representa?
maikonaraujo
Aescolhadopivoestaimplementadanoseucódigodeformarandômica,quandoovalordopivofor0elenãoordenaapartedaesquerda(oucomoestánosecódigo" if (p < f) …")omesmoparaadireita.Estasduaslinhasaiehaordenaçãodovetordaesquerdaedadireita.Oqueoseumétodoestáfazendoé:1ordenarapenasumelemento(opivô);2ordenarafiladaesquerda,senecessário;3ordenarafiladadireita,senecessário.
Estes dois “if’s” que vc perguntou fazem exatamente o tópico 2 e 3.
edymrex
Valeu cara estou conseguindo entender…!
mais tenho uma duvida o pivô e escolhido aleatoriamente certo…!
mais porque desse forma
intx=0+aleatorio.nextInt(vet.length-1);???
[quote]
J
Jack_Old
CARACAS muleke vc sempre colocando seus exercícios aqui, já é a 3ª vez, putz, não adianta pedir que você quebre a cabeça um pouco. Na boa cara, se você se esforçar um pouco mais eu tenho certeza que as idéias surgem.
Administradores aonde estão vocês?
maikonaraujo
"mais porque desse forma int x = (int) (Math.random()*(u-p+1))+p int x = 0+aleatorio.nextInt(vet.length-1); ??? "
Para tornar possível a recursão, tenta entender um pouco o seu código, ou pelo menos lê-lo, tem um tópico interessante sobre recursão em:
P/Jack_Old vc sempre me enchendo o saco…!
cara fica na sua se vc tem mal vontande fodas é o seu, intão vai encher o saco de outro…!
p/maikonaraujo
valew cara entendi perfeitamente como a estrutura funciona qualquer duvida eu coloco ai d novo…!
J
Jack_Old
Muleke má vontade é o caramba, vc que é um preguiçoso!!! Mas é bom assim, quanto mais topera na área mais vaga sobra para quem é esforçado…
edymrex
P/Jack_Old
Não vou discutir com você peço que os administradores prestem à atenção em você,
em outros pots você ta enchendo sempre o saco nunca ajuda.
Aqui e pra um ajudar o outro, qualquer duvida que eu tiver irei postar mesmo, e o fodas e seu se você não gosta, se você está achando ruim monte um fórum só pra você seu bosta…!