Mergesort imprimindo passo a passo

1 resposta
P

Gente, estou tentando criar um mergesort, sendo que imprima passo a passo em um arquivo, mas só imprimi o final já ordenado! Segue o código

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;


public class mergesort {

	static void gravar(int[] v, String saida) throws IOException{
  	    FileWriter arq = new FileWriter(saida);
	    PrintWriter gravarArq = new PrintWriter(arq);
	    int n = v.length;
	    for (int i=0;i<n-1;i++){
	    gravarArq.printf("%d"+" ",v[i]);
	    gravarArq.printf("\n", saida);
	    }
	    
	    arq.close();
    }
	      

	
	 public static int[] mergeSort(int array[], String arquivo) throws IOException

	   {
	   	
	   	if(array.length > 1)
	   	{
	   		
	   		
	   		int elementsInA1 = array.length/2;
	   		
	   		int elementsInA2 = elementsInA1;
	   		
	   		if((array.length % 2) == 1)
	   			elementsInA2 += 1;
	   		
	   		int arr1[] = new int[elementsInA1];
	   		int arr2[] = new int[elementsInA2];
	   		
	   		for(int i = 0; i < elementsInA1; i++)
	   			arr1[i] = array[i];
	   		
	   		for(int i = elementsInA1; i < elementsInA1 + elementsInA2; i++)
	   			arr2[i - elementsInA1] = array[i];
	   	
	   		arr1 = mergeSort(arr1, arquivo);
	   		gravar(arr1, arquivo);
	   		arr2 = mergeSort(arr2, arquivo);
	   		gravar(arr2, arquivo);
	   		
	   		int i = 0, j = 0, k = 0;
	   		
	   		while(arr1.length != j && arr2.length != k)
	   		{
	   			if(arr1[j] > arr2[k])
	   			{
	   				
	   				array[i] = arr1[j];
	   				
	   				i++;
	   				
	   				j++;
	   			}
	   			
	   			else
	   			{
	   				
	   				array[i] = arr2[k];
	   				
	   				i++;
	   				
	   				k++;
	   			}
	   		}
	   		
	   		while(arr1.length != j)
	   		{
	   			array[i] = arr1[j];
	   			i++;
	   			j++;
	   			
	   			
	   		
	   		}
	   		while(arr2.length != k)
	   		{
	   			array[i] = arr2[k];
	   			i++;
	   			k++;
	   			
	   			
	   		}
	   	}
	   
	   	gravar(array,arquivo);
	   	return array;
	   }

	
	public static void main(String[] args) {
		   
		System.out.printf("\nConteúdo do arquivo texto:\n");
	    try {
	      FileReader arq = new FileReader(args[0]);
	      BufferedReader lerArq = new BufferedReader(arq);
	 
	      String linha = lerArq.readLine(); // lê a primeira linha
	// a variável "linha" recebe o valor "null" quando o processo
	// de repetição atingir o final do arquivo texto
	      String[] c = linha.split(" ");
	      
	      //Convertendo de String para int
	      int[] valoresInt = new int[c.length];  
	      
	      for (int i = 1; i < c.length; i++) {  
	          valoresInt[i] = Integer.parseInt(c[i]);  
	      }  
	      
	    // int tam = valoresInt.length;
	      
	      mergeSort(valoresInt, args[1]);
	      

	      
	      while (linha != null) {
	        System.out.printf("%s\n", linha);
	       
	        linha = lerArq.readLine(); // lê da segunda até a última linha
	        
	      }
	      arq.close();
	    } catch (IOException e) {
	        System.err.printf("Erro na abertura do arquivo: %s.\n",
	          e.getMessage());
	    }
	    
	    System.out.println();
	  }
}

1 Resposta

TerraSkilll

Não testei seu código, mas imagino que o seu método gravar() está sobrescrevendo o arquivo toda vez que é chamado, quando na verdade o que você queria era adicionar uma nova linha nele.

Penso ser mais fácil você abrir o arquivo antes de iniciar o mergesort, e dentro do merge somente usar o método println, conforme descrito aqui : [url]http://www.guj.com.br/articles/13[/url]

Ficaria mais ou menos assim:

public class mergesort {
  File arquivo;
  FileWriter writer;
  PrintWriter saida;

  static void gravar(int[] v) throws IOException{  
    String s;
    for (int i=0;i<n-1;i++){  
      s += " " + v[i];
    }  
    saida.println(s);
  }

  public static int[] mergeSort(int array[], String arquivo) throws IOException{  
    //realiza o mergesort: basicamente, o mesmo código que você postou

    gravar(array);

    mergesort(array);
  }

  public static void main(String args[]){
    try{
      arquivo = new File("saida.txt");
      writer = new FileWriter("saida.txt");
      saida = new PrintWriter(writer);
      
      // lê o vetor e chama o mergesort

      saida.close();
      writer.close();
    }catch (Exception e){
      e.printStackTrace();
    }
  }

}
Abraço.
Criado 15 de outubro de 2012
Ultima resposta 16 de out. de 2012
Respostas 1
Participantes 2