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

C++ Discussion :

Programmation du tri par tas


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Par défaut Programmation du tri par tas
    Bonjour a tous,
    J'ai une petite question actuellement, étudiant je dois programmer un algorithme de tri par tas en c++.
    Et quelque petit souci a priori, rien ne se passe comme sa devrait se passer
    SI quelqu'un pouvait m'aider sa serait avec plaisir.

    J'ai fais la modification que tu me propose il y a du mieux mais sa ne marche toujours pas..

    help me please

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    #include <iostream>
    using namespace std;
    void echanger(int& a,int& b)
    {
        int aux=a;
        a=b;
        b=aux;
    }
    void ajouter(int arbre[], int *noeud, int x)
    {
        int i;
        *noeud=*noeud+1;
        arbre[*noeud]=x;
        i=*noeud;
     
        while (i>=1 && arbre[i]<arbre[i/2])
        {
            echanger(arbre[i],arbre[i/2]);
            i =i/2;
        }
    }
     
    void supprimerMin(int arbre[], int *noeud, int *min)
    {
        int i=1,j=0;
        arbre[1]=arbre[*noeud];
        *noeud=*noeud-1;
        while ((*noeud/2) >= i )
        {
            j=2*i;
            if ((j != *noeud) && (arbre[j+1] < arbre[j]))
            {
                j++;
            }
     
            if (arbre[i]>arbre[j])
            {
                echanger(arbre[i],arbre[j]);
                i=j;
            }
            else
            {
                i=*noeud;
            }
        }
    }
     
    void trinoeudarTas(int arbre[],int taille)
    {
     
        int noeud=1,min=arbre[1];
     
        while (noeud<taille)
        {
            ajouter(arbre,&noeud,arbre[noeud+1]);
        }
     
        cout<<"noeud==taille"<<endl<<endl;
        for (int i=1;i<10;i++)
        {
            cout<<arbre[i]<<" || ";
        }
     
     
        while (noeud>0)
        {
            supprimerMin(arbre,&noeud,&min);
     
            arbre[noeud+1]=min;
        }
    }
     
    int main()
    {
     
        int arbre[10]={10,0,7,4,1,6,3,4};
     
        for (int i=1;i<10;i++)
        {
            cout<<arbre[i]<<" || ";
        }
        cout<<endl;
        trinoeudarTas(arbre,8);
        cout<<endl;
     
        for (int i=1;i<10;i++)
        {
            cout<<arbre[i]<<" || ";
        }
     
     
        return 0;
    }
    Merci d'avance

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    la fonction echanger ne fait rien, l faut utiliser des références : void echanger(int& a,int & b)

    j'avoue que je n'ai pas regarder le reste de l'algo
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Par défaut Mise a jour
    up
    Help please

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    avez-vous modifié echanger comme indiqué ?
    est-ce que cela marche avec cette nouvelle définition ?

    sinon je remarque que vous affichez le contenu du vecteur à partir du rang 1, or le premier élément est au rang 0. Est-ce une simple erreur de typo locale ou une vraie erreur de votre part ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,
    personnellement je vois déjà deux problèmes potentiels dans le code :
    • Comme le dit bruno_pages, les tableaux en C++ commencent à l'indice 0 et non 1. Les boucles for (int i=1;i<10;i++) n'affecte donc que les éléments de 1 à 9 (au lieu 0 à 9, soit les 10 éléments).
    • Dans la fonction void supprimerMin(int arbre[], int *noeud, int *min), min n'est jamais affecté !
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      void supprimerMin(int arbre[], int *noeud, int *min)
      {
          int i=1,j=0;
          // d'après les tests effectués dans les autres fonctions pour ranger les éléments, 
          // le plus petit semble être à la racine de l'arbre, donc
         *min = arbre[0]; 
       
          arbre[0]=arbre[*noeud];
    Remarque : il est possible d'alléger quelque peu l'écriture en utilisant des références plutôt que des pointeurs pour le passage de certains paramètres (noeud, min).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Par défaut
    En fait, oui l'incrémentation de 1 a 9 est volontaire.
    Car dans la case 0, qui je suis d'accord est la première valeur du tableau correspond a la longueur de notre tableau.
    Donc pour un tableau de taille n, dans la T[0]=n.

    Représentation que nos enseignants nous conseille pour les tas.

    Et oui j'ai fais les modifs directement sur le premier

    Si il y a bien une décrémentation de faite dans la fonction supprimer.
    Sinon j'obtiendrai une boucle infini, il me semble...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void supprimerMin(int arbre[], int *noeud, int *min)
    {
        int i=1,j=0;
        arbre[1]=arbre[*noeud];
        *noeud=*noeud-1;//permet la décrementation

Discussions similaires

  1. programme en c "tri par tas"
    Par lyna191 dans le forum C
    Réponses: 3
    Dernier message: 28/12/2017, 11h44
  2. Réponses: 8
    Dernier message: 07/09/2016, 22h12
  3. je veux faire un tri par tas afficher dans une arbre
    Par amam22 dans le forum Débuter
    Réponses: 5
    Dernier message: 26/02/2013, 23h33
  4. Programme de tri par tas
    Par charafzizou dans le forum C++
    Réponses: 2
    Dernier message: 05/01/2010, 10h37

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