MergeSort

2 respostas
G

Olá pessoal, estou com um problema, estou com esse mergesort de inteiros, e preciso passa-lo para String, não consegui achar nenhum pronto na net p dar uma olhada e entender, n estou conseguindo passar p string, e estou precisando urgentemente, gostaria que voces me dessem uma luz, n to sabendo comparar as Strings nesse mergesort.

import java.util.Vector; 

public class MergeSort { 
private KeyboardReader keyboard; 
private Vector numbers; 

/* 
* Constructor 
*/ 
public MergeSort() { 
this.keyboard = new KeyboardReader(); 
this.createArray(); 
System.out.println("Your array is " + this.numbers.toString()); 
this.Mergesort(this.numbers, 0, this.numbers.size()-1); 
System.out.println("Merge Sort Answer: "); //Display the string. 
System.out.println(this.numbers.toString()); 
} 

/* 
* Create a array numbers[i] 
*/ 
private void createArray() { 
int n = this.keyboard.readInt("How many integers do you want to sort? "); 
System.out.println("(If you didn't input integers, system would ask you to input again.)"); 
this.numbers = new Vector(n); 
for (int i = 0; i < n; i++){ 
int x = this.keyboard.readInt("Please give No. " + i + ": "); 
this.numbers.add(i, new Integer(x)); 
} 
} 

/* 
* Divide and Conquer: recurrence 
*/ 
private void Mergesort(Vector A, int p, int r) { 
if (p < r){ 
int q = (p + r) / 2; 
//System.out.println("Recursive begins: "); 
//System.out.println("p is " + p + " . q is " + q + ". r is " + r); 
Mergesort(A, p, q); 
Mergesort(A, q + 1, r); 
Merge(A, p, q, r); 
} 
} 

/* 
* Merge two sorted array: takes Big Theta (n) 
*/ 
private void Merge(Vector A, int p, int q, int r){ 
int i = 0; 
int j = 0; 
//create arrays L[1..n1 + 1] and R[1..n2 + 1] 
Vector left = new Vector(); 
Vector right = new Vector(); 
for (int n = 0; n < q-p+1; n++){ 
left.add(A.get(p + n)); 
} 
for (int n = 0; n < r-q; n++){ 
right.add(A.get(q+n+1)); 
} 
//add the sentinel value to left and right array 
left.add(new Integer(100)); 
right.add(new Integer(200)); 

for (int k = p; k <= r; k++){ 
if (((Integer)left.get(i)).compareTo((Integer)right.get(j)) <= 0 ){ 
A.set(k, left.get(i)); 
i++; 
} 
else { 
A.set(k, right.get(j)); 
j++; 
} 
//System.out.println(A.toString()); 
} 
} 
/* 
* Main method 
*/ 
public static void main(String[] args) { 
new MergeSort(); 
} 
} 

Essa classe aqui é p ler os tipos dados, entre eles tem o de string, quando coloco o readString na classe Mergesort da erro pois a maneira de comparar string é diferente de inteiro, n to conseguindo adaptar, na hora da ordenação ele  erro: 

import java.io.*; 
public class KeyboardReader extends Object{ 

private BufferedReader keyboardReader; 
//creates a new KeyboardReader 
public KeyboardReader(){ 
this.keyboardReader = new BufferedReader(new InputStreamReader(System.in)); 
} 


public String readString(String prompt){ 
System.out.print(prompt); 
String input = null; 
try { 
input = this.keyboardReader.readLine(); 

} catch (IOException error) { 
} 
return input; 
} 


public int readInt(String prompt){ 
int bool = 0; 
int input = 0; 
while (bool == 0) { 
try{ 
input = Integer.parseInt(this.readString(prompt)); 
bool = 1; 
}catch(Exception error){ 
} 
} 
return input; 
} 

public double readDouble(String prompt){ 
int bool = 0; 
double input = 0; 
while (bool == 0) { 
try{ 
input = Double.parseDouble(this.readString(prompt)); 
bool = 1; 
}catch(Exception error){ 
} 
} 
return input; 
} 


public char readChar(String prompt){ 
int bool = 0; 
String input = this.readString(prompt); 
while (input.equals("")){ 
input = this.readString(prompt); 
} 
char st = input.charAt(0); 
return st; 
} 
}

2 Respostas

L

eu naum vi seu programa todo… mas segue algo que pode te ajudar, um merge que ordena qualquer lista que seja Comparable (String, Integer, etc). Eu adaptei o codigo que esta nesse topico:
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=33486&highlight=mergesort

ps: soh para java 5

package lubs;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Mer<E extends Comparable<E>> {

	public void mergeSort(List<E> x, int esq, int dir) {
		if (esq < dir) {
			int medio = (esq + dir) / 2;
			mergeSort(x, esq, medio);
			mergeSort(x, medio + 1, dir);
			mezclar(x, esq, medio + 1, dir);
		}
	}

	public void mezclar(List<E> x, int posEsq, int posDir, int posFin) {
		Stack<E> xAux2 = new Stack<E>();
		int finIzq = posDir - 1;
		int numElementos = posFin - posEsq + 1;

		while (posEsq <= finIzq && posDir <= posFin) {
			if (x.get(posEsq).compareTo(x.get(posDir)) < 0)
				xAux2.push(x.get(posEsq++));
			else
				xAux2.push(x.get(posDir++));
		}

		while (posEsq <= finIzq)
			xAux2.push(x.get(posEsq++));

		while (posDir <= posFin)
			xAux2.push(x.get(posDir++));

		for (int i = 0; i < numElementos; i++, posFin--)
			x.set(posFin, xAux2.pop());
	}

	/* testes */

	public static void testeOrdenaString() {
		List<String> x = new ArrayList<String>();
		x.add("zelia");
		x.add("patricia");
		x.add("camila");
		x.add("adriana");
		x.add("emilia");
		x.add("bianca");
		x.add("giseli");
		x.add("bruna");
		new Mer<String>().mergeSort(x, 0, x.size() - 1);
		for (String l : x) {
			System.out.println(l);
		}
	}

	public static void testeOrdenaInteiro() {
		List<Integer> x = new ArrayList<Integer>();
		x.add(9);
		x.add(5);
		x.add(3);
		x.add(8);
		x.add(1);
		x.add(5);
		x.add(2);
		x.add(10);
		new Mer<Integer>().mergeSort(x, 0, x.size() - 1);
		for (Integer l : x) {
			System.out.println(l);
		}
	}

	public static void main(String[] args) {
		testeOrdenaInteiro();
		testeOrdenaString();
	}
}
G

Valeu Cara era isso mesmo que queria
Valeuuu Pela Ajuda!!!

Criado 11 de novembro de 2006
Ultima resposta 11 de nov. de 2006
Respostas 2
Participantes 2