IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Tri Fusion en Javascript


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 31
    Points : 19
    Points
    19
    Par défaut Tri Fusion en Javascript
    Bonjour,

    Je tente d'implémenter un algorithme de tri fusion en Javascript dans "l'ardoise" de Firefox Dev Edition. J'ai un message d'erreur "out of memory". Je pense que j'ai une boucle infinie, mais je ne vois pas où.
    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function triFusion(tab) {
      var rep = [];
      var tabL = tab.length;
      if(tabL < 2) {
        console.log("Tableau déjà trié, il n'y a rien à faire!" +tab);
        return tab;
      } else {
        var q = Math.ceil(tabL / 2);
        var left = triFusion(tab.slice(0,q));
        var right = triFusion(tab.slice(q+1, tabL));
        return fusion(left, right); 
      }
    }
     
    function fusion(tabLeft, tabRight) {
      var ans = [];
      var tabLeftL = tabLeft.length;
      var tabRightL = tabRight.length;
      var cpteurL = 0;
      var cpteurR = 0;
     
      while((cpteurL < tabLeftL) && (cpteurR < tabRightL)) {
        if(tabLeft[cpteurL] >= tabRight[cpteurR]) {
          ans.push(tabLeft[cpteurL]);
          cpteurL += 1;
     
        } else {
          ans.push(tabRight[cpteurR]);
          cpteurR +=1;
     
        }
      } 
      for(var i = cpteurL; i < tabLeftL; i++) {
        ans.push(tabLeft[i]);
      }
     
      for(var j = cpteurR; j < tabRightL; j++) {
        ans.push(tabRight[j]);
      }
     
      return ans;
    }
     
    var tableau = [9, 0, 1, 9, 3, 5, 4, 7, 2, 6, 4, 1, 0, 3, 9, 8, 7, 5, 1, 3, 9, 8, 5, 3, 0, 1, 3];
    triFusion(tableau);
    Merci pour votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    J'ai regardé vite fais, je suis pas sûr de ce que j'avance:

    Il me semble que tu va sortir de ta boucle while avec des valeurs pour cpteurL et l'autre égales à la taille de ton tab.

    Du coup, dans ta boucle for ton i vaut d'entrée la valeur de ton compteur et il me semble bien que tu n'entre même pas dans tes boules for et que par conséquent le tableau ans que tu renvoies est vide.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 31
    Points : 19
    Points
    19
    Par défaut Résolu
    Merci pour ta réponse. Le problème se situait au niveau de l'appel récursif, je faisais une mauvaise division du tableau; l'indice de début du second tableau n'était pas bon.
    La solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    function triFusion(tab) {
      var rep = [];
      var tabL = tab.length;
      if(tabL < 2) {
        //console.log("Tableau déjà trié, il n'y a rien à faire!" +tab);
        return tab;
      } else {
        var q = Math.ceil(tabL / 2);
        var left = triFusion(tab.slice(0,q));
        console.log("left: " +left);
        var right = triFusion(tab.slice(q, tabL));
        return fusion(left, right); 
      }
    }
     
    function fusion(tabLeft, tabRight) {
      var ans = [];
      var tabLeftL = tabLeft.length;
      var tabRightL = tabRight.length;
      var cpteurL = 0;
      var cpteurR = 0;
     
      while((cpteurL < tabLeftL) && (cpteurR < tabRightL)) {
        if(tabLeft[cpteurL] > tabRight[cpteurR]) {
          ans.push(tabLeft[cpteurL]);
          cpteurL += 1;
     
        } else {
          ans.push(tabRight[cpteurR]);
          cpteurR +=1;
     
        }
      } 
      for(var i = cpteurL; i < tabLeftL; i++) {
        ans.push(tabLeft[i]);
      }
     
      for(var j = cpteurR; j < tabRightL; j++) {
        ans.push(tabRight[j]);
      }
     
      return ans;
    }
     
    var tableau = [9, 0, 1, 9, 3, 5, 4, 7, 2, 6, 4, 1, 0, 3, 9, 8, 7, 5, 1, 3, 9, 8, 5, 3, 0, 1, 3];
    var reponse = triFusion(tableau);
    console.log("la reponse: " +reponse);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri fusion avec pthread
    Par Sh4dow49 dans le forum Débuter
    Réponses: 34
    Dernier message: 22/06/2008, 21h02
  2. Tri tableaux en javascript
    Par bupapi dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 24/07/2007, 09h22
  3. Complexité de l'algorithme de Tri Fusion
    Par judge06 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 26/03/2007, 22h04
  4. le tri fusion ne tri pas.
    Par argon dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 27/06/2006, 23h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo