Tri fusion [Résolu/Fermé]

Signaler
-
 zmandar -
Bonjour,


la taille du tableau compris entre 2 et 512
chaque fois ,je veux calculer dans le tri fusion le nombre de comparaison et le nombre d'affectation des éléments du tableau
je veux utiliser java
moi j'ai créé ce code mais je quelque erreurs aide moi pour le corriger






package projet;

/**
*
* @author Administrateur
*/
import java.io.*;
public class fichierfusion1 {

static int cn;
static int an;


public static void fichier (int taille, int d,int an) throws IOException
{
File fichier = new File("C:\\tri-fusion-qcque.txt") ;
BufferedWriter out = new BufferedWriter(new FileWriter(fichier, true));
String k = String.valueOf(d);
String h = String.valueOf(an);
String t = String.valueOf(taille);
out.write(t+" "+k+" "+h);
out.newLine();
out.close() ;
}
public static int[] random(int T[],int taille)
{


int i=0;
for( i=0;i<taille;i++){

T[i]=(int)(Math.random() *(512-2)+2);}
return T;


}

public static int[] fusion(int [] tab1, int [] tab2)
{

int taille_g=tab1.length;
int taille_d=tab2.length;
int [] res=new int[taille_g+taille_d]; //En Java, lorsqu'on déclare un tableau, il faut indiquer sa longueur
int i_g=0;
int i_d=0;
int i; //L'auteur ne met pas d'accolades après le for il faut donc déclarer i ici
for(i=0;i_g<taille_g && i_d<taille_d;i++)
cn++;
if(tab1[i_g] <= tab2[i_d])
{ an++;
res[i]=tab1[i_g++];}
else
{ res[i]=tab2[i_d++];} //Attention c'est tab2
/* on copie le reste du tableau de gauche (s'il reste quelque chose) */
while(i_g<taille_g)
res[i++]=tab1[i_g++]; //Ne pas oublier le ++ sinon on a une boucle infinie
while(i_d<taille_d)
res[i++]=tab2[i_d++]; //Pareil c'est tab2
return res;}


public static int[] copie(int [] tab, int debut, int fin)
{
int[] res=new int[fin-debut+1]; //Pareil, on indique la longueur
for(int i=debut;i<=fin;i++)
{
res[i-debut]=tab[i];
}
return res;
}

public static int[] tri_fusion(int[] tab,int taille)throws IOException
{

if(taille<=1)
return tab;
else
{
int mileu = taille/2;
int[] gauche = copie(tab,0,mileu-1);
int[] droite = copie(tab,mileu,taille-1);
return fusion(tri_fusion(gauche,mileu),tri_fusion(droite,(taille-mileu)));
}
for(int f=0;f<taille;f++)
{
System.out.print(tab[f]+" ");
}
System.out.print("\n");


fichier (taille, cn,an );
return tab ;
}

public static void main (String []args) throws IOException
{
int i ;

for (i=2;i<=512;i++){
int []T=new int [i];
random( T,i );


tri_fusion(T,i);}
}










}









}

3 réponses

Messages postés
16079
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 octobre 2020
2 705
Deux erreurs principales qui te posent problème :

1) Ton affichage, et l'appel à la méthode fichier sont utilisés dans une partie du code qui n'est jamais appelée : tu as un return avant !

2) Tu as oublié les accolades de la boucle for(i=0;i_g<taille_g && i_d<taille_d;i++)

Ensuite il y a un certain nombre de petites choses à corriger qui misent bout-à-bout peuvent elles aussi générer des erreurs, comme par exemple utiliser deux fois le même nom pour deux variables distinctes !

En corrigeant les erreurs, et en faisant "un peu" de ménage, j'obtient ceci :

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Fusion1
{
   private static int traceA, traceB;
   
//*******************************************************************
   
   private static void fichier(int taille, String nomFichier) throws IOException
   {       
      BufferedWriter out = new BufferedWriter(
                        new FileWriter(
                           new File(nomFichier),true
                        )
                     ); 
            
      out.write(taille+"\t"+traceA+"\t"+traceB); 
      out.newLine(); 
      out.close() ; 
   }

//*******************************************************************
   
   private static int[] random(int T[], int taille) 
   {
      for(int i=0; i<taille; i++)
      { 
         T[i]=(int)(Math.random()*(512-2)+2);
      }
      return T; 
   } 

//*******************************************************************
   
   private static int[] fusion(int[] tab1, int[] tab2) 
   { 
      int i, i_g=0, i_d=0;      
      int taille_g=tab1.length, taille_d=tab2.length; 
      
      int [] res=new int[taille_g+taille_d];
      
      for(i=0; i_g<taille_g && i_d<taille_d; i++) 
      {
         traceB++;
         if(tab1[i_g] <= tab2[i_d]) 
         {
            traceA++;
            res[i]=tab1[i_g++];
         } 
         else 
         {
            res[i]=tab2[i_d++];
         }
      }
      
// on copie le reste du tableau de gauche (s'il reste quelque chose)
      
      while(i_g<taille_g)
      {
         res[i++]=tab1[i_g++]; // Ne pas oublier le ++ (boucle infinie)
      }
      
      while(i_d<taille_d)
      {
         res[i++]=tab2[i_d++]; // Pareil c'est tab2
      }
      
      return res;
   } 

//*******************************************************************
   
   private static int[] copie(int[] tab, int debut, int fin) 
   { 
      int[] res=new int[fin-debut+1]; 
      
      for(int i=debut; i<=fin; i++) 
      { 
         res[i-debut]=tab[i]; 
      } 
      return res; 
   } 

//*******************************************************************
   
   public static int[] tri_fusion(int[] tab,int taille)
   {
      if(taille<=1) 
         return tab; 
      else 
      { 
         int milieu = taille/2; 
         int[] gauche = copie(tab,0,milieu-1); 
         int[] droite = copie(tab,milieu,taille-1);
         
         return fusion(tri_fusion(gauche,milieu),
                       tri_fusion(droite,(taille-milieu))); 
      }      
   } 

//*******************************************************************
   
   private static void afficher(int[] tab)
   {
      for (int i=0; i<tab.length; i++)
         System.out.print(tab[i]+" ");
      System.out.println();
   }
   
   private static void test(int i, String nomFichier) throws IOException
   {   
      int[] T=new int[i]; 
      random(T,i);
      
      traceA=0; traceB=0;
      afficher(tri_fusion(T,i));
      
      fichier(i,nomFichier);      
   }
   
   public static void main (String []args) throws IOException 
   {
      for (int i=2; i<512; i++)
         test(i,"C:\\tri-fusion-qcque.txt");
   }
}
merci beaucoup
svp je pas compris l 'utilité de la methode fichier et la methode test
svp aide moi
Messages postés
16079
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 octobre 2020
2 705
La méthode fichier y était déjà, je n'y ai quasiment pas touché, je l'ai juste appelé au bon moment. Elle ouvre le fichier et ajoute à la fin les valeurs de taille, traceA et traceB

Quant à test, c'est un mélange de la partie du code de main et de celui qui était "caché" dans fusion et jamais appelé. Elle créé un tableau aléatoire, le tri, et enregistre les traces dans le fichier.
merccccccccccccciiiiiiiiiiiiiiiii beaucoup