Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tri fusion

static ? et plus

Sujet résolu
    6 décembre 2009 à 19:47:48

    Bonsoir, voici l'algorithme de mon tri fusion que j'ai tenté de traduire du php au java. Piquer ici

    Malheureusement celui ci m'indique une erreur car il veut ma fonction tri_fusion en static ( pas comprit mais ok je le fait)
    Et la il compile sauf que il plante directement après
    Pourriez vous m'aidez ?

    Voici le code

    public class Tri_fusion {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int [] a={18,15,11,1,5,6,13,9,7,4,24,5,} ; 
    		//lancement de la fonction qui trie
    		int [] b =tri_fusion(a);
    		
    	}
    	
    	
    	
    	public int[] fusion(int [] tab1, int [] tab2)
    	{
    		int taille_g=tab1.length;
    		int taille_d=tab2.length;
    		int [] res;
    		int i_g=0;
    		int i_d=0;
    		for(int i=0;i_g<taille_g && i_d<taille_d;i++)
    		{
    			if(tab1[i_g] <= tab2[i_d])
    				res[i]=tab1[i_g++];
    			else
    				res[i]=tab1[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];
    			while(i_d<taille_d)
    				res[i++]=tab1[i_d];
    		}
    	}
    	
    	public int[] copie(int [] tab, int debut, int fin)
    	{
    		int[] res;	
    		for(int i=debut;i<=fin;i++)
    		{
    			res[i-debut]=tab[i];
    		}
    	}
    
    	public int[] tri_fusion(int[] tab)
    	{
    		int taille = tab.length;
    		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),tri_fusion(droite));
    		}
    	}
    }
    


    Voici l'erreur :
    Exception in thread "main" java.lang.Error: Unresolved compilation problem:

    at Tri_fusion.main(Tri_tas.java:7)

    • Partager sur Facebook
    • Partager sur Twitter
      6 décembre 2009 à 20:49:00

      Bonsoir,

      Il y a plusieurs erreurs dans ton code :
      D'abord toutes tes fonctions doivent être déclarées public static ; de plus tes fonctions "fusion" et "copie" ne comportent pas l'instruction return alors qu'elles ne sont pas du type void . Je pense que tu a oublié à la fin return res;
      • Partager sur Facebook
      • Partager sur Twitter
        7 décembre 2009 à 10:19:03

        rebonjour, voici le code modifié mais qui plante encore
        public class Tri_fusion {
        
        	/**
        	 * @param args
        	 */
        	public static void main(String[] args) {
        		// TODO Auto-generated method stub
        		int [] a={18,15,11,1,5,6,13,9,7,4,24,5,} ; 
        		
        		int [] b =tri_fusion(a);
        		
        	}
        	
        	
        	
        	public static int[] fusion(int [] tab1, int [] tab2)
        	{
        		int taille_g=tab1.length;
        		int taille_d=tab2.length;
        		int [] res;
        		int i_g=0;
        		int i_d=0;
        		for(int i=0;i_g<taille_g && i_d<taille_d;i++)
        		{
        			if(tab1[i_g] <= tab2[i_d])
        				res[i]=tab1[i_g++];
        			else
        				res[i]=tab1[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];
        			while(i_d<taille_d)
        				res[i++]=tab1[i_d];
        		}
        		return res;
        	}
        	
        	public static int[] copie(int [] tab, int debut, int fin)
        	{
        		int[] res;	
        		for(int i=debut;i<=fin;i++)
        		{
        			res[i-debut]=tab[i];
        		}
        		return res;
        	}
        
        	public static int[] tri_fusion(int[] tab)
        	{
        		int taille = tab.length;
        		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),tri_fusion(droite));
        		}
        	}
        }
        


        J'ai testé comme tu a dit cependant eclipse me dit que la variable res n'est pas initialisé :(
        Et ca plante sévère.

        D'ailleurs je voit pas comment on sort de cette boucle
        while(i_g<taille_g)
        				res[i++]=tab1[i_g];
        

        car on incrémente i or i n'est pas dans les conditions ... bizarre ça
        • Partager sur Facebook
        • Partager sur Twitter
          7 décembre 2009 à 23:05:15

          Houlà,
          J’avais lu ton code rapidement et je n’avais pas vu toutes ces erreurs.
          Voilà ma correction :
          public class Tri_fusion {
          
          	
          	public static void main(String[] args) {
          		int [] a={18,15,11,1,5,6,13,9,7,4,24,5} ; //Suppression d’une virgule inutile
          		
          		int [] b =tri_fusion(a);
          		
          	}
          	
          	
          	
          	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++)
          			if(tab1[i_g] <= tab2[i_d])
          				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 = tab.length;
          		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),tri_fusion(droite));
          		}
          	}
          }
          


          Voilà, normalement ça marche. Salut ;)
          • Partager sur Facebook
          • Partager sur Twitter
            8 décembre 2009 à 10:15:12

            Merci a toi ça fonctionne parfaitement, voici le code exacte avec la boucle de parcourt, pour ceux qui voudrait d'un tri fusion.

            public class Tri_fusion {
            
            	
            	public static void main(String[] args) {
            		int [] a={18,15,11,1,5,6,13,9,7,4,24,5} ; //Suppression d’une virgule inutile
            		
            		int [] b =tri_fusion(a);
            		
            		for(int i=0;i<b.length;i++)
            		{
            			System.out.println("Element n°"+i+" :"+b[i]);
            		}
            	}
            	
            	
            	
            	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++)
            			if(tab1[i_g] <= tab2[i_d])
            				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 = tab.length;
            		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),tri_fusion(droite));
            		}
            	}
            }
            
            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2012 à 19:05:26

              Citation : Naintroll

              Merci a toi ça fonctionne parfaitement, voici le code exacte avec la boucle de parcourt, pour ceux qui voudrait d'un tri fusion.

              public class Tri_fusion {
              
              	
              	public static void main(String[] args) {
              		int [] a={18,15,11,1,5,6,13,9,7,4,24,5} ; //Suppression d’une virgule inutile
              		
              		int [] b =tri_fusion(a);
              		
              		for(int i=0;i<b.length;i++)
              		{
              			System.out.println("Element n°"+i+" :"+b[i]);
              		}
              	}
              	
              	
              	
              	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++)
              			if(tab1[i_g] <= tab2[i_d])
              				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 = tab.length;
              		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),tri_fusion(droite));
              		}
              	}
              }
              


              Salut tous le monde :)

              est il possible de transformer les deux methodes fusions et tri_fusion en void ?????
              J'ai essaye mais le complier m'affiche que:
              La methode fusion (Objet,Objet) ne peut pas etre applique pour des arguments (void,void)
              (Je veut faire un appel recursiv : fusion(tri_fusion(gauche),tri_fusion(droite)); avec tri fusion est une void methode)

              Merci d'avance :)
              • Partager sur Facebook
              • Partager sur Twitter
                24 janvier 2012 à 19:17:39

                Tu peux faire:
                public static void tri_fusion(int[] tab)
                	{
                		int taille = tab.length;
                		if(taille<=1)
                			return tab;
                		else
                		{
                			int mileu = taille/2;
                			int[] gauche = copie(tab,0,mileu-1);
                			int[] droite = copie(tab,mileu,taille-1);
                			this.fusion(tri_fusion(gauche),tri_fusion(droite));
                		}
                	}
                


                et:

                public static void 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++)
                			if(tab1[i_g] <= tab2[i_d])
                				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
                		
                	}
                
                • Partager sur Facebook
                • Partager sur Twitter
                  24 janvier 2012 à 22:38:18

                  Citation : HenriBleujeutiez

                  Tu peux faire:

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



                  et:

                  public static void 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++)
                  			if(tab1[i_g] <= tab2[i_d])
                  				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
                  		
                  	}
                  

                  Merci :) mais ca ne fonctionne pas.
                  1. This est fonctionel seulement avec non static methode.
                  2. et si je change la signature de la methode c est la meme problem qu'avant
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 janvier 2012 à 22:54:41

                    Alors il faut que tu enlèves les static que tu as ajouté automatiquement. Ensuite tu crées une nouvelle classe avec le main dedans. Tu l'appelles start où ce que tu veux. Dedans ce main, tu fais un new Tri_fusion();
                    Tu supprimes le main de ta classe Tri_fusion et tu laisses les variables contenues à l'intérieur.
                    public class Tri_fusion {
                    
                    	/**
                    	 * @param args
                    	 */
                    	
                    		// TODO Auto-generated method stub
                    		int [] a={18,15,11,1,5,6,13,9,7,4,24,5,} ; 
                    		//lancement de la fonction qui trie
                    		int [] b =tri_fusion(a);
                    
                    		
                    		public int[] fusion(int [] tab1, int [] tab2)
                    		{
                    			int taille_g=tab1.length;
                    			int taille_d=tab2.length;
                    			int [] res=new int[taille_g+taille_d];
                    			int i_g=0;
                    			int i_d=0;
                    			for(int i=0;i_g<taille_g && i_d<taille_d;i++)
                    			{
                    				if(tab1[i_g] <= tab2[i_d])
                    					res[i]=tab1[i_g++];
                    				else
                    					res[i]=tab1[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];
                    				while(i_d<taille_d)
                    					res[i++]=tab1[i_d];
                    			}
                    			return res;
                    		}
                    		
                    		public 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 int[] tri_fusion(int[] tab)
                    		{
                    			int taille = tab.length;
                    			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),tri_fusion(droite));
                    			}
                    		
                    	}
                    
                    }
                    


                    public class start {
                    
                    	/**
                    	 * @param args
                    	 */
                    	public static void main(String[] args) {
                    		// TODO Auto-generated method stub
                    		
                    		new Tri_fusion();
                    
                    	}
                    
                    }
                    
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Tri fusion

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown