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

Pascal Discussion :

Problème avec le quicksort


Sujet :

Pascal

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 64
    Par défaut Problème avec le quicksort
    bonjour
    je fais un programme qui trie des elements dans un tableau, je me sert du quicksort
    j'utilise un code pris dans
    http://www.dailly.info/algorithmes-de-tri/rapide.php
    ( le pseudo code )
    et enfaite mon programme ne marche pas et je ne comprend pas se qui va pas
    merci pour votre aide

    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
    program trie_de_colone;
    uses crt;
    type tableau = array[1..4] of integer;
    var
      choix, i : byte;
      tab : tableau;
     
    procedure trier_tableau(tab_trie : tableau; debut, fin : integer);
       var
          pivot : integer;
     
       function partition (tab_part : tableau; premier, dernier : integer) : integer; 
          var
             cpt, pivot, swap, s : integer;
     
          BEGIN
             cpt := premier;
             pivot := tab_part[premier];
             for s := (premier + 1) to dernier do
                begin
                   if tab_part[s] < pivot then
                      begin
                        {inc(cpt);}
                         swap := tab_part[cpt];
                         tab_part[cpt] := tab_part[s];
                         tab_part[s] := swap;
                         inc(cpt);
                     end;
                end;
     
            swap := tab_part[cpt];
            tab_part[cpt] :=tab_part[premier];
            tab_part[premier] := swap;
            partition := cpt;
          END;
     
       BEGIN
          if debut < fin then
             begin
                pivot := partition(tab_trie, debut, fin);
                trier_tableau(tab_trie, debut, (pivot - 1));
                trier_tableau(tab_trie, (pivot + 1), fin);
             end;
       END;
     
    BEGIN
       clrscr;
       writeln('algo de trie');
       {tableau pour essayer}
       tab[1] := 4;
       tab[2] := 1;
       tab[3] := 3;
       tab[4] := 2;
       trier_tableau (tab,1 ,4);
       writeln('tableau final');
       for i := 1 to 4 do
          begin
             write(tab[i]);
             readln;
          end;
    END.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 962
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 962
    Par défaut
    Jai,

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure trier_tableau(tab_trie : tableau; debut, fin : integer);
    la déclaration telles qu'elle est implique que la procédure travaille avec une copie locale du tableau.

    Il faut déclarer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure trier_tableau(var tab_trie : tableau; debut, fin : integer);
    du coup, je n'ai pas lu plus loin.
    l

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 64
    Par défaut
    j ai changer mais sa marche toujours pas

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 962
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 962
    Par défaut
    Gie,

    Il y a le même problème de copie locale dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function partition (tab_part : tableau; premier, dernier : integer) : integer;
    qu'il faut donc déclarer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function partition (var tab_part : tableau; premier, dernier : integer) : integer;
    D'autre part, dans cette même procédure, il y a une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                   if tab_part[s] < pivot then
                      begin
                        {inc(cpt);}
                         swap := tab_part[cpt];
                         tab_part[cpt] := tab_part[s];
                         tab_part[s] := swap;
                         inc(cpt);
                     end;
    il faut effectivement incrémenter cpt avant de faire le swap, comme tu l'avais fait au début.

    Il faut donc faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                   if tab_part[s] < pivot then
                      begin
                         inc(cpt);
                         swap := tab_part[cpt];
                         tab_part[cpt] := tab_part[s];
                         tab_part[s] := swap;
                     end;
    J'imagine que tu as changé ça en voyant que ça ne marchait pas.

    Et ça devrait marcher, mais je n'ai pas testé, juste lu.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 64
    Par défaut
    Oui j avait mit le inc(cpt) apres car sa ne marchais pas.
    je vien de faire les modification que tu as dit sa marche nikel
    Merci les gars

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

Discussions similaires

  1. problème avec un algo quicksort
    Par aaronlbk dans le forum C++
    Réponses: 3
    Dernier message: 14/08/2014, 11h31
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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