Quick sort

11 respostas
edymrex

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

private static void ordena(int a[], int p, int u)

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

import javax.swing.JOptionPane;


public class Quick 
{
	   
	/*----------------------------------------------------------------------*/
	/* 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.              */
	/*----------------------------------------------------------------------*/
	  private static void ordena(int a[], int p, int u) 
	  {
	    int i = p, f = u;                        // Extremos
	    int x = (int) (Math.random()*(u-p+1))+p; // Aleatório
	    int pivô = a[x];                         // para evitar quadrático
	    
	    while (i <= f) 
	    {                         // Enquanto não se cruzarem
	      
	      while (i < u && a[i] < pivô) i++;      // Organiza primeira metade
	      
	      while (f > p && a[f] > pivô) f--;      // Organiza segunda metade
	      
	      if (i <= f) {                          // Se ainda não acabou
	        x = a[f];                            // troca os elementos
	        a[f--] = a[i];                       // dos dois lados
	        a[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ô
	  }
	  
	  public static void main(String args[])
	  {
		  int vet[] = new int [10];
		  int i;
		  
		  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).                 */
	/*----------------------------------------------------------------------*/
	 


}

11 Respostas

Deh

acho que você deve quebrar um pouco a cabeça…

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 = new int[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.

import javax.swing.JOptionPane;
import javax.swing.JTextArea;

public class Quick 
{
	   
	/*----------------------------------------------------------------------*/
	/* 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.              */
	/*----------------------------------------------------------------------*/
	  private static void ordena(int a[], int p, int u) 
	  {
	    int i = p, f = u;                        // Extremos
	    int x = (int) (Math.random()*(u-p+1))+p; // Aleatório
	    int pivô = a[x];                         // para evitar quadrático
	    
	    while (i <= f)  // Enquanto não se cruzarem
	    {                        
	      
	      while (i < u && a[i] < pivô) i++;      // Organiza primeira metade
	      
	      while (f > p && a[f] > pivô) f--;      // Organiza segunda metade
	      
	      if (i <= f) {                          // Se ainda não acabou
	        x = a[f];                            // troca os elementos
	        a[f--] = a[i];                       // dos dois lados
	        a[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ô
	    
	    
	  }
	  
	  public static void main(String args[])
	  {
		  String saida="";
		  JTextArea texto = new JTextArea(10,10);
		  int vet[] = new int [10];
		  int i;
		  
		  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
A escolha do pivo esta implementada no seu código de forma randômica, quando o valor do pivo for 0 ele não ordena a parte da esquerda ( ou como está no se código " if (p < f) …" ) o mesmo para a direita.

Estas duas linhas ai eh a ordenação do vetor da esquerda e da direita.

O que o seu método está fazendo é :

1 ordenar apenas um elemento (o pivô);

2 ordenar a fila da esquerda, se necessário;

3 ordenar a fila da direita, se necessá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

int x = 0+aleatorio.nextInt(vet.length-1); ???

[quote]

J

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:

http://www.guj.com.br/posts/list/43115.java

[]´s

edymrex

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

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…!

Criado 15 de outubro de 2006
Ultima resposta 19 de out. de 2006
Respostas 11
Participantes 4