Partage
  • Partager sur Facebook
  • Partager sur Twitter

tri fusion/tableau 2D/javascript

Sujet résolu
    10 mars 2010 à 0:10:33

    Bonjour,

    Je voudrai coder un tri par fusion avec javascript pour un tableau à 2 dimensions.
    Le code que j'ai écrit ne plante pas mais le résultat n'est pas trié...
    Je me suis grandement inspiré du tuto de bluestorm, Cygal et lastsseldon "Introduction au problème du tri"

    Voila mon code:

    //fusion des deux demi tableaux
    function fusion(tab_g, tab_d)
    {
    	
       var taille_g = tab_g.length;
       var taille_d = tab_d.length;
       var tailleMax = taille_g + taille_d;		
       var res = new Array(); // tableau résultat
       
       for(var i = 0; i < tailleMax; i++)
          res[i] = new Array();
       // indices de lecture, g->gauche, d->droite	
       var i_g = 0;
       var i_d = 0;
       
       for (var i = 0; i_g < taille_g && i_d < taille_d; ++i)
       {
       		if (parseInt(tab_g[i_g][1]) <= parseInt(tab_d[i_d][1]))
       		{
       			for(var j = 0; j < 4; j++)
       	        	res[i][j] = tab_g[i_g][j];	
    	        i_g++;	
    	    }
    	    else
    	    {
    	        for(var j = 0; j < 4; j++)	     	        	        	
    	        	res[i][j] = tab_d[i_d][j];
    	        i_d++;
    	    }	
       }
       
      /* on copie le reste du tableau de gauche (s'il reste quelque chose) */
      while (i_g < taille_g)
      {
      		for(var j = 0; j < 4; j++)
      		{       
      			res[i][j] = tab_g[i_g][j];
      		}
      		i_g++;	
      		i++;
      }
      /* pareil pour le tableau de droite */
      while (i_d < taille_d)
      {
      		for(var j = 0; j < 4; j++)	 
      		{ 
      			res[i][j] = tab_d[i_d][j];
      		}
      		i_d++;
      		i++;	
      } 
    //  for(var i=0;i<tailleMax;i++)
    //  {
    //	 
    //	  	alert(res[i][1]); 
    //  }
       return res;
    }
    
    //copie des deux bouts de tableau 
    function copie(tab, debut, fin)
    {	
       var res = new Array();
       for (var i = debut; i <= fin; ++i)
       {
       	  res[i-debut] = new Array();	
       	  for (var j = 0; j < 4; j++)
    	  		res[i-debut][j] = tab[i][j];      	
        }
       
       return res;
    }
    
    //tri par fusion du tableau de resultats
    function tri_fusion(tab)
    {
      var taille = tab.length;
      if (taille <= 1)
          	return tab;
      else
      {
        var milieu = parseInt(taille / 2);
        var gauche = copie(tab, 0, (milieu-1));
        var droite = copie(tab, milieu, (taille-1));	
        return fusion(tri_fusion(gauche), tri_fusion(droite));
       }
    }
    



    Et l'appel de la fonction:
    tri_fusion(resultats_finaux);
    


    Merci d'avance pour votre aide
    • Partager sur Facebook
    • Partager sur Twitter
      10 mars 2010 à 0:35:44

      EDIT : On peut voir un exemple de resultats_finaux ?
      • Partager sur Facebook
      • Partager sur Twitter
        10 mars 2010 à 9:53:39

        voila plutot le code qui rempli le tableau resultats_finaux:

        //trie les resultats en fonction de la distance
        function calculDist(results)
        {
        	var results_temp = new Array();
        	for (var i = 0; i < results.length; i++) 
        	{
        		results_temp[i] = new Array();
        		var result = results[i]; // Get the specific result
        		var circonference= parseFloat("40075017");
        		var degre = parseFloat("360");
        		var conversion = circonference/degre;
        		var calcul = Math.sqrt((getPosition().x-result.lng)*conversion*conversion*(getPosition().x-result.lng) + (getPosition().y-result.lat)*(getPosition().y-result.lat)*conversion*conversion);
        		var distance = parseInt (calcul);
        		var dirX ='';
        		var dirY = '';
        		
        		if ( getPosition().x > result.lng )
        			dirX='O';
        		else
        			dirX='E';
        			
        		if (getPosition().y > result.lat )
        			dirY='S';
        		else
        			dirY='N';
        		results_temp[i][0] = result;	
        		results_temp[i][1] = distance;
        		results_temp[i][2] = dirX;
        		results_temp[i][3] = dirY;
        	}
        	return results_temp;
        }
        



        et l'appel:

        function chargeLBS() 
        {			
        	// mettre le menu dans PDA
        	var contentPDA = document.getElementById("PDA") ;
        	contentPDA.innerHTML = menu;
        	var controlContainer = document.getElementById('chercher'); 		// ATTENTION DIV DU CHERCHEUR
        	controlContainer.style.width = '350px'; 
        	searchControl = new google.search.SearchControl();
        	searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
        	//on initialise une instance de recherche locale
        	searcher = new google.search.LocalSearch(); 
        	searcher.setCenterPoint(getMap()); 						//MODIFICATION
        	searchControl.addSearcher(searcher);
        	//on recupere les resultats de la recherche
        	searchControl.setSearchCompleteCallback(searcher , function() {
        		getMap().clearOverlays();
        		getMap().addOverlay(getPerso());
        		var results = searcher.results; // recuperation des resultats
        		var msghtml="";
        		
        		
        		var resultats_finaux = calculDist(results);
        		
        		tri_fusion(resultats_finaux);		
        		for(var i = 0; i < resultats_finaux.length; i++)
        		{
        			alert(resultats_finaux[i][1]);
        		}
        		
        		for (var i = 0; i < results.length; i++) 
        		{
        			var result = results[i]; // Get the specific result
        			msghtml+= "<b>"+resultats_finaux[i][0].titleNoFormatting +"</b><br/>" + resultats_finaux[i][0].streetAddress + "<br/>" + resultats_finaux[i][0].city + "<br/>" + resultats_finaux[i][0].phoneNumbers[0].number + "<br/>" + resultats_finaux[i][1] +"m  " + resultats_finaux[i][3] + resultats_finaux[i][2] + " <br/><br/>";
        			
        			var markerLatLng = new google.maps.LatLng(parseFloat(result.lat),parseFloat(result.lng));
        			var marker = new google.maps.Marker(markerLatLng); // Create the marker
        			// Bind information for the infoWindow aka the map marker popup
        			marker.bindInfoWindow(result.html.cloneNode(true));
        			result.marker = marker; // bind the marker to the result
        			getMap().addOverlay(marker); // add the marker to the map
        			searchControl.clearAllResults();
        		}	
        	var contentResultat = document.getElementById('Fenetre');
        	msghtml +="<a href='#' onclick='chargeMenu();'>Revenir au menu</a>";;
        	contentResultat.innerHTML='';
        	contentResultat.innerHTML=msghtml;
        	
        	});
        	//on dessine l'outil de recherche
        	
        	searchControl.draw(controlContainer);
        
        }
        


        results est donc un objet retourné lors d'une recherche sur une google maps

        merci de ton aide


        C'est bon j'ai trouvé mon erreur :p je mettais le resultat de calculDist(result) dans resultats_finaux au lieu de mettre le résultat de tri_fusion() ouf c'était juste une bétise...Désolé du dérangement...

        var resultats_finaux = calculDist(results);
        tri_fusion(resultats_finaux);

        MODIF: var resultats = calculDist(results);

        var resultats_finaux = tri_fusion(resultats);


        merci qd meme
        • Partager sur Facebook
        • Partager sur Twitter

        tri fusion/tableau 2D/javascript

        × 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