[RESOLVIDO] Ordem lexicográfica com quicksort?

3 respostas
F

Olá a todos!

Fiz esse código para ordenar lexicograficamente arrays de String, mas não está funcionando, ele roda, mas a saída não é a esperada...

Alguém pode me ajudar? Pois já passei dias mexendo nesse código e não consegui achar o erro...

CÓDIGO:

public class QuickS {
	
	public int acharPivo(String[] s) {
		return (int) Math.floor(s.length / 2);
	}
	
	public int particiona(String[] array, int i, int f) {
		
		int a = i + 1;
		int b = f;
		
		int pivo = acharPivo(array);
		
		while (a < b) {
			
			while (a <= f && array[a].compareTo(array[pivo]) <= 0) {
				a++;				
			}
			while (array[b].compareTo(array[pivo]) > 0) {
				b--;				
			}
			
			if (a < b) {
				String temp = array[a];
				array[a] = array[b];
				array[b] = temp;
			}
			
		}
		
		String temp = array[b];
		array[b] = array[i];
		array[i] = temp;
		
		return b;
		
	}
	
	public void quicksort(String[] array, int i, int f) {
		if (i < f) {
			int p = particiona(array, i, f);
			quicksort(array, i, p - 1);
			quicksort(array, p + 1, f);
		}
	}
	
	public void quicksort(String[] array) {
		quicksort(array, 0, (array.length - 1));
	}
	
	
	
	public static void main(String[] args) {
		
		
		QuickS sorting = new QuickS();
		
		String[] nomes = new String[6];
		
		nomes[0] = "flavio";
		nomes[1] = "fernanda";
		nomes[2] = "lamartine";
		nomes[3] = "ideginaldo";
		nomes[4] = "luiza";
		nomes[5] = "giselly";
		
		for(int i = 0; i < 6; i++) {
			System.out.print(nomes[i]);
			System.out.print(" ");
		}
		
		System.out.println("");
		sorting.quicksort(nomes);
		
		for(int i = 0; i < 6; i++) {
			System.out.print(nomes[i]);
			System.out.print(" ");
		}
		
	}

}

Abraço!

3 Respostas

F

Pessoal, eu ainda não consegui achar onde está o erro, quando estava no trabalho me ocorreu que poderia ser no método que acha o pivô, mas modifiquei e não era…

Quando uso o debug do Eclipse eu percebo que ele não ordena os elementos, apenas troca alguns de posição…

Tô torrando meu cerebro aqui…

Alguém me ajuda… PELO AMOR DE DEUS! :smiley:

Abraço!

F

Pessoal!! Consegui!!! Resolvi postar aqui como resolvi esse problema, caso alguém se interesse...

1º - Quando eu chamava acharPivo no método particiona, ele sempre pegava o elemento do meio, mesmo que entrasse na recursão; resolvi isso adicionando dois int como parametros, um para indicar o começo e o outro prar indicar o fim de onde deve-se achar o pivo. Assim quando o método entra na recursão, ele checa quem é o pivo do subconjunto esquerdo, e depois do direito.

public int acharPivo(String[] s, int ini, int fim) {
                // Também tirei o que seria a função chão: Math.floor
                // Java  faz isso pra mim... :D
		return (fim + ini / 2);
	}

2º - Eu só estava trocando o elemento do começo pelo pivo depois de ter realizado todas as trocas, o que me dava uma troca errada por entrada na recursão, no final, todo minha saída estava desorganizada... Falta de atenção, pois no algoritmo, o pivo deve ser trocado logo no início... Assim meu código ficou dessa forma:

public int particiona(String[] array, int i, int f) {

		int a = i;
		int b = f;

		int pivo = acharPivo(array, i, f);

		String temp = array[b];
		array[b] = array[i];
		array[i] = temp;

		while (a < b) {

			while (a <= f && array[a].compareTo(array[pivo]) <= 0) {
				a++;
			}
			while (array[b].compareTo(array[pivo]) > 0) {
				b--;
			}

			if (a < b) {
				String temp2 = array[a];
				array[a] = array[b];
				array[b] = temp2;
			}

		}

		return b;

	}

O Resto continua igual... Quem se interessou em saber qual o erro, taí a resposta...

Abraço!

J

E na pesquisa binária como ficaria será?

Criado 8 de outubro de 2008
Ultima resposta 10 de set. de 2010
Respostas 3
Participantes 2