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 :

Erreur tri rapide


Sujet :

Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Points : 19
    Points
    19
    Par défaut Erreur tri rapide
    salut,
    pouvez-vous me dire ce quoi l'erreur de ce programme qui permet de trier un tableau avec la méthode de tri rapide (Quick sort)
    j'essayer d'exécuter ce programme mais l'exécution se bloque!!!!!!!il y a une errreur qui m'a fait déchirer les chéveux.
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    program trirapide;
    uses wincrt;
    type
       tab=array[1..20]of integer;
    var
        t:tab;
        n:integer;
    {****************************************}
    procedure saisie(var n:integer;var t:tab);
    var
    i:integer;
    begin
        repeat
            write('n = ');readln(n);
        until n>=10;
        randomize;
        for i:=1 to n do
               t[i]:=random(30);
    end;
    {****************************************}
    procedure affiche(n:integer;t:tab);
    var
    i:integer;
    begin
        for i:=1 to n do
            write(t[i]:4);
    end;
    {****************************************}
    procedure tri_rapide(var t:tab;g,d:integer);
    var
    i,j,aux:integer;
    begin
    if g<d then
      begin
        i:=g+1;j:=d;
        repeat
            while (i<j)and(t[i]<t[g]) do
                  i:=i+1;
            while (i<=j)and(t[j]>=t[g]) do
                  j:=j-1;
            if i<j then
               begin
                   aux:=t[i];
                   t[i]:=t[j];
                   t[j]:=aux;
               end;
     
        until i>j;
        aux:=t[j];
        t[j]:=t[g];
        t[g]:=aux;
        tri_rapide(t,g,j-1);
        tri_rapide(t,j+1,d);
      end;
    end;
    {****************************************}
    begin
        saisie(n,t);
        writeln('les éléments avant TRI : ');
        affiche(n,t);
        tri_rapide(t,1,n);
        writeln('les éléments après TRI : ');
        affiche(n,t);
    end.

  2. #2
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    salut.
    après une vue de nez je pense que le problème est le fait que
    tu n'as pas changer la valeur des bornes de ton tableau au passage

    donc tu dois ajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    i := i+1;
    j := j-1;
    après cette permutation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
              begin               
                  aux:=t[i];
                   t[i]:=t[j];
                   t[j]:=aux;
               end;

  3. #3
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    moi quand je vois des variables globales se faire écrasée par des locales, ça m'herisse le poil.

    un identifiant, sert justement à identifier et sans discipline, ils ne servent à rien!

    on doit le voir dix milliards de fois c'est nom de diable de t:tab.

    et ton algo est faux.

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    program Project36;
     
    {$IF RTLVersion >= 13.0}
      {$APPTYPE CONSOLE}
      uses Windows, SysUtils;
    {$ELSE}
      uses WinCrt;
     
      function GetTickCount: LongWord; stdcall; external 'kernel32.dll';
    {$IFEND}
     
    const
      MinLength = 10;
      MaxLength = 100;
      MinRandom = 0;
      MaxRandom = 100;
     
    type
      TIntArray = array of integer;
     
     
    procedure IntArrayAdjustLength(var vLength: integer; var vIntArray: TIntArray);
    var
      i: integer;
    begin
      repeat
        write('Taille du tableau = ');
        readLn(vLength);
      until (vLength >= MinLength) and (vLength <= MaxLength);
     
      setLength(vIntArray, vLength);
      for i := 0 to vLength-1 do
        vIntArray[i] := MinRandom+random(MaxRandom-MinRandom+1);
    end;
     
    procedure IntArrayWrite(aIntArray: TIntArray);
    var
      i, vHi:integer;
    begin
      vHi := high(aIntArray);
      write('[');
      for i := 0 to vHi do
      begin
        write(aIntArray[i]:2);
        if i < vHi then
          write(', ');
      end;
      writeLn(']');
    end;
     
     
    procedure IntArrayQuickSort(var vIntArray: TIntArray; iLo, iHi: Integer);
    var
      vLo, vHi, vPivot, vT : Integer;
    begin
      vLo := iLo;
      vHi := iHi;
      vPivot := vIntArray[(vLo + vHi) shr 1];
      repeat
        while vIntArray[vLo] < vPivot do
          Inc(vLo);
        while vIntArray[vHi] > vPivot do
          Dec(vHi);
     
        if vLo <= vHi then
        begin
          vT             := vIntArray[vLo];
          vIntArray[vLo] := vIntArray[vHi];
          vIntArray[vHi] := vT;
          Inc(vLo);
          Dec(vHi);
        end;
      until vLo > vHi;
     
      if vHi > iLo then
        IntArrayQuickSort(vIntArray, iLo, vHi);
     
      if vLo < iHi then
        IntArrayQuickSort(vIntArray, vLo, iHi);
    end;
     
    var
      IntArray : TIntArray;
      IntArrayLength : integer;
      SortTime : LongWord;
    begin
      Randomize;
     
      IntArrayAdjustLength(IntArrayLength, IntArray);
     
      writeLn('les éléments avant TRI : ');
      IntArrayWrite(IntArray);
     
      SortTime := GetTickCount;
      IntArrayQuickSort(IntArray, 0, IntArrayLength-1);
      SortTime := GetTickCount-SortTime;
     
      writeLn('durée du tri : ', SortTime,' millisecondes');
      writeLn('les éléments après TRI : ');
      IntArrayWrite(IntArray);
     
      ReadLn;
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    salut,
    merci pour vos remarque,
    sayé, j'ai trouvé l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (i<=j)and(t[i]<t[g]) do
                  i:=i+1;

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    Et voilà le code complet :
    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
    program trirapide;
    uses wincrt;
    type
       tab=array[1..20]of integer;
    var
        t:tab;
        n:integer;
    {****************************************}
    procedure saisie(var n:integer;var t:tab);
    var
    i:integer;
    begin
        repeat
            write('n = ');readln(n);
        until n>=10;
        randomize;
        for i:=1 to n do
               t[i]:=random(30);
    end;
    {****************************************}
    procedure affiche(n:integer;t:tab);
    var
    i:integer;
    begin
        for i:=1 to n do
            write(t[i]:4);
    end;
    {****************************************}
    procedure tri_rapide(var t:tab;g,d:integer);
    var
    i,j,aux:integer;
    begin
    if g<d then
      begin
        i:=g+1;j:=d;
        repeat
            while (i<j)and(t[i]<t[g]) do
                  i:=i+1;
            while (i<=j)and(t[j]>=t[g]) do
                  j:=j-1;
            if i<j then
               begin
                   aux:=t[i];
                   t[i]:=t[j];
                   t[j]:=aux;
               end;
     
        until i>j;
        aux:=t[j];
        t[j]:=t[g];
        t[g]:=aux;
        tri_rapide(t,g,j-1);
        tri_rapide(t,j+1,d);
      end;
    end;
    {****************************************}
    begin
        saisie(n,t);
        writeln('les éléments avant TRI : ');
        affiche(n,t);
        tri_rapide(t,1,n);
        writeln('les éléments après TRI : ');
        affiche(n,t);
    end.

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    ok, ça, ça s'appel ne pas tenir compte des remarques des autres.

    tu n'as même pas pris la peine de jeter un oeuil à la correction que je t'ai poster.
    si tu n'as pas besoin d'aide, ne poste pas sur un forum.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    mais j'ai dis :
    Citation Envoyé par bzminfo Voir le message
    merci pour vos remarque,

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

Discussions similaires

  1. Pb tri rapide
    Par Vinzius dans le forum C
    Réponses: 9
    Dernier message: 10/04/2006, 18h55
  2. tri rapide étéractif
    Par renardmp dans le forum Général Python
    Réponses: 3
    Dernier message: 20/02/2006, 02h12
  3. Tri rapide
    Par mikees dans le forum Assembleur
    Réponses: 1
    Dernier message: 19/12/2005, 21h53
  4. Tri Rapide sur un CLIST
    Par ensisoft dans le forum MFC
    Réponses: 9
    Dernier message: 13/12/2005, 23h22
  5. Tri rapide
    Par DBBB dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 10/12/2004, 17h54

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