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 :

Tri par interclassement multiple


Sujet :

Pascal

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 32
    Points
    32
    Par défaut Tri par interclassement multiple
    bonsoir, desolé pour l'absence j'avais quelque probleme.
    mais aussi j'ai pu modifier le language, il est maintenant encore plus correct, mais il existe encore des probleme, j'espere que vous pourrait m'aider.
    je copier tous mon program pour vous faciliter le travaille
    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
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    program triii;
     
    uses fdelay,crt;
    type tfile=file of integer;
    var r : integer;
        t3,t4 : ttab;
        p : integer;
     
     
    procedure initind(var ind:ttab;p:integer);
    var i:integer;
    begin
         for i:=1 to p do
             ind[i]:=(i-1)*p;
    end;
    procedure charger(var f:tfile;var t:ttab;p,taille,no:integer);
    var i:integer;
    begin
        seek(f,(no-1)*taille);
        for i:=1 to taille do
        begin
             read(f,no);
             t[i]:=no;
        end;
    end;
    procedure sauvegarder(var f:tfile;var t:ttab;p,taille,no:integer);
    var i:integer;
    begin
         seek(f,(no-1)*taille);
         for i:=1 to taille do
             write(f,t[i]);
    end;
    function tousmoinsun(var ind:ttab;p:integer):boolean;
    var estvide : boolean;
        i : integer;
        t : ttab;
    begin
         estvide:=true;i:=1;
         while(i<=n) and (estvide) do
         begin
              if t[i]<>-1 then estvide:=false
                          else i:=i+1;
         end;
         tousmoinsun:=estvide;
    end;
    procedure chercher_min(var f1:tfile;var ind:ttab;var min,place:integer);
    var i,x : integer;
    begin
         i:=1;
         while(i<=p) and (ind[i]=-1) do
                     i:=i+1;
         place:=i;
         seek(f1,ind[place]);
         read(f1,min);
         i:=i+1;
         while (i<=p) do
         begin
               if (ind[i]=-1) then i:=i+1
                               else begin
                                         seek(f1,ind[i]);
                                         read(f1,x);
                                         if (x<min) then begin
                                                                   min:=x;
                                                                   place:=i;
                                                              end
                                         else i:=i+1;
                               end;
         end;
    end;
    procedure segmentation(var t:ttab;bi,bs:integer;var place:integer);
    var pivot,i,j,x : integer;
    begin
         pivot:=t[bi];
         i:=bi+1;j:=bs;
         while (i<=j) do
         begin
              if t[i]<pivot then i:=i+1
              else begin
                        if t[i]>pivot then j:=j-1
                        else if i<j then begin
                                              x:=t[i];
                                              t[i]:=t[j];
                                              t[j]:=x;
                                              j:=j-1;
                                              i:=i+1;
                                         end;
                    end;
         end;
         x:=t[bi];
         t[bi]:=t[j];
         t[j]:=x;
         place:=j;
    end;
    procedure tri_quicksort(var t:ttab;bi,bs:integer);
    var place : integer;
    begin
         if bi<bs then begin
                            segmentation(t,bi,bs,place);
                            tri_quicksort(t,bi,place-1);
                            tri_quicksort(t,place+1,bs);
                       end;
    end;
    procedure tri_intermult(nom:char);
    const p=4;
    var t,ind : ttab;
        f1,f2 : tfile;
        fini : boolean;
        i,taille,min,place : integer;
    begin
         {$i-}
         assign(f1,nom);
         reset(f1);
         {$i+}
         if Ioresult<>0 then begin
                                  writeln('erreur');
                                  halt(1);
                             end;
         initind(ind,p);
         for i:=1 to p do
         begin
              charger(f1,t,p,taille,i);
              tri_quicksort(t,1,taille);
              sauvegarder(f1,t,p,taille,i);
         end;
         fini:=false;
         while(not fini) do
         begin
              chercher_min(f1,ind,min,place);
              write(f2,min);
              ind[place]:=ind[place]+1;
              if (ind[place]=place*taille)
                 then ind[place]:=-1;
              fini:=tousmoinsun(ind,p);
         end;
         close(f1);
     
         close(f2);
         rename(f2,nom);
    end;
     
     
     
    begin
    clrscr;
     
    writeln('tapez entrer pour commencer le random ');
    readln;
     
     
    randomize;
    for r:=1 to n do
    begin
         t3[r]:=random(n);
         writeln(t3[r]);
    end;
     
     
     
    tri_intermult('0');
     
    writeln('voici le trie : ');
    readln;
     
    for r:=1 to n do
        writeln(t4[r]);
     
    readln;
    end.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Laq,

    Présentation pas terrible, pas un seul commentaire, code pas aéré

    - Présentation : l'indentation est là, c'est bien, mais les blocs sont beaucoup trop décalés, ce qui diminue l'effet attendu : améliorer la lisibilité.

    - Commentaires : c'est toujours utile, même pour toi, de mettre au moins quelques mots pour dire ce que doit faire une procédure.
    Et c'est d'autant plus utile/nécessaire quand tu veux faire lire/corriger ton code par quelqu'un d'autre

    - Aération du code : mettre quelques lignes vides pour aérer le code est très utile pour la lisibilité, entre autres pour séparer les procédures.


    Par là-dessus, code incomplet, manque au moins la définition des types utilisés, même si pour le tableau ce n'est pas difficile à déviner, ainsi que celle des constantes, qui ont en principe ont dû servir à définit ce type.

    Et enfin, comme c'est plus qu'un petit détail que tu veux qu'on corrige, un code complet et compilable serait fortement apprécié.
    Ça nous permettrait au moins de voir comment et avec quel genre de données tu utilises tes procédures
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    @ droggo : pour son indentation, il a certainement fait un copier-coller à partir de son "IDE" et ça a donné ce résultat là. Je crois me rappeller qu'Emacs fait ce genre d'indentation (mais pas sur que ce soit celui-là).

    Je te trouve quand même bien aggressif dans tes posts.

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Citation Envoyé par Loceka
    Je te trouve quand même bien aggressif dans tes posts.
    Certes la forme des réponses de droggo peut sembler parfois aggressive, même si je pense que dans le fond elles n'ont pas ce but, mais sur le fond des réponses il a raison concernant l'indentation. C'est un point important : si les poseurs de questions ne font pas d'effort pour se faire comprendre et faire comprendre leur code, est-il légitime que nous fassions des efforts pour eux ? Dans une certaine mesure oui, mais il faut pas pousser ! Evidemment, il y a toujours des cas extrêmes, mais dans le fond, il serait préférable que tous les codes soient correctement indentés et tout à fait lisibles (utopie ). Je ne défends pas droggo, et il m'arrive aussi de trouver qu'il fait parfois des réponses aggressives, mais dans le fond il n'a pas tort

    Pour en revenir au problème initial, peux-tu poster le code complet si il n'est pas trop long, avec la définition des variables types et autres, et indiquer exactement à quel ligne ca plante ?
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Kan,
    Citation Envoyé par Loceka
    @ droggo : pour son indentation, il a certainement fait un copier-coller à partir de son "IDE" et ça a donné ce résultat là. Je crois me rappeller qu'Emacs fait ce genre d'indentation (mais pas sur que ce soit celui-là).
    C'est probablement vrai, mais il n'est pas bien difficile, une fois posté et le résultat vérifié, de remettre le code en forme.

    Citation Envoyé par Loceka
    Je te trouve quand même bien aggressif dans tes posts.
    Je n'ai jamais eu l'intention d'être agressif, et je n'ai absolument pas l'impression de l'être.

    Je me suis contenté de dire ce que je pense du code en question, sans faire de ronds de jambes. C'est un peu sec, mais je n'y vois et n'y ai mis aucune agressivité.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 32
    Points
    32
    Par défaut
    je pense qui y'a pas trop de désordre, mais bon, tous ce que je veux moi c'est quelqu'un qui connait le principe et m'aide a résoudre le probleme.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 32
    Points
    32
    Par défaut
    bon t'a raison
    voila tous le code, c'est juste des essais c'est pour ca il n'est pas trop orgabisé :


    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
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    program trii;
     
    uses fdelay,crt;
    const n=20;
    type ttab = array[1..n] of integer;
    var r : integer;
        t,t2,t5 : ttab;
     
     
    procedure tri_comptage(var t:ttab;var t2:ttab);
    var ind : ttab;
        i,j : integer;
    begin
         for i:=1 to n do
             ind[i]:=1;
         for i:=1 to n do
         begin
              for j:=i+1 to n do
              begin
                   if t[i]<t[j] then ind[j]:=ind[j]+1
                   else ind[i]:=ind[i]+1;
              end;
         end;
         for i:=1 to n do
             t2[ind[i]]:=t[i];
    end;
     
    procedure tri_bulles(var t:ttab;var t2:ttab);
    var i,j,x :integer;
        permu : boolean;
    begin
    i:=1;permu:=true;
    begin
         while(permu=true) do
         begin
              permu:=false;
              for j:=1 to n-1 do
              begin
                   if t[j]>t[j+1] then begin
                                            x:=t[j];
                                            t[j]:=t[j+1];
                                            t[j+1]:=x;
                                            permu:=true;
                                       end;
                   end;
              end;
         end;
         for j:=1 to n do
                  t2[j]:=t[j];
    end;
     
    procedure rechercher(var t:ttab;var place:integer;elem:integer;var nbelem:integer);
    var k : integer;
        arret : boolean;
    begin
         k:=1;arret:=false;place:=nbelem;
         while(not arret) and (k<nbelem) do
         begin
              if t[k]<elem then k:=k+1
                           else begin
                                place:=k;
                                arret:=true;
              end;
         end;
    end;
    procedure inserer(var t2:ttab;plac:integer;nbirelem:integer;max:integer);
    var i : integer;
    begin
         for i:=max to plac+1 do
             t2[i]:=t2[i-1];
         t2[plac]:=nbirelem;
    end;
    procedure tri_insertion(var t,t2:ttab);
    var y,place:integer;
    begin
         for y:=1 to n do
         begin
              rechercher(t2,place,t[y],y);
              inserer(t2,place,t[y],y);
         end;
    end;
     
     
    procedure initind(var ind:ttab;p:integer);   {c'est par ici commence le tri par  interclassement multiple}
    var i:integer;
    begin
         for i:=1 to p do
             ind[i]:=(i-1)*p;
    end;
    function tousmoinsun(var ind:ttab;p:integer):boolean;
    var estvide : boolean;
        i : integer;
    begin
         estvide:=true;i:=1;
         while(i<=n) and (estvide) do
         begin
              if t[i]<>-1 then estvide:=false
                          else i:=i+1;
         end;
         tousmoinsun:=estvide;
    end;
    procedure chercher_min(var t1:ttab;var ind:ttab;var min,place:integer);
    var i : integer;
    begin
         i:=1;
         while(i<=n) and (ind[i]=-1) do
                     i:=i+1;
         place:=i;
         min:=ind[place];
         i:=i+1;
         while (i<=n) do
         begin
               if (ind[i]=-1) then i:=i+1
                               else begin
                                         if (ind[i]<min) then begin
                                                                   min:=ind[i];
                                                                   place:=i;
                                                              end
                                         else i:=i+1;
                               end;
         end;
    end;
    procedure segmentation(var t:ttab;bi,bs:integer;var place:integer);
    var pivot,i,j,x : integer;
    begin
         pivot:=t[bi];
         i:=bi+1;j:=bs;
         while (i<=j) do
         begin
              if t[i]<pivot then i:=i+1
              else begin
                        if t[i]>pivot then j:=j-1
                        else if i<j then begin
                                              x:=t[i];
                                              t[i]:=t[j];
                                              t[j]:=x;
                                              j:=j-1;
                                              i:=i+1;
                                         end;
                    end;
         end;
         x:=t[bi];
         t[bi]:=t[j];
         t[j]:=x;
         place:=j;
    end;
    procedure tri_quicksort(var t:ttab;bi,bs:integer);
    var place : integer;
    begin
         if bi<bs then begin
                            segmentation(t,bi,bs,place);
                            tri_quicksort(t,bi,place-1);
                            tri_quicksort(t,place+1,bs);
                       end;
    end;
    procedure tri_intermult(nom1:char);
    var t,t1,t2,ind : ttab;
        fini : boolean;
        i,taille,min,place : integer;
    begin
         initind(ind,n);
         for i:=1 to n do
         begin
              tri_quicksort(t,i,taille);
              t1[i]:=t[i];
         end;
         fini:=false;i:=1;
         while(not fini) do
         begin
              chercher_min(t1,ind,min,place);
              t2[i]:=min;
              ind[place]:=ind[place]+1;
              if (ind[place]=place*taille)
                 then ind[place]:=-1;
              fini:=tousmoinsun(ind,n);
              i:=i+1;
         end;
    end;
     
    {et c'est ici ou ce termine}
     
     
    begin
    clrscr;
     
    writeln('tapez entrer pour commencer le random ');
    readln;
     
     
    randomize;
    for r:=1 to n do
    begin
         t[r]:=random(n);
         writeln(t[r]);
    end;
     
    {tri_comptage(t,t2);
     
    tri_bulles(t,t2);         
     
    tri_insertion(t,t2);      }
     
    tri_intermult('0');
     
    writeln('voici le trie : ');
    readln;
     
    for r:=1 to n do
        writeln(t2[r]);
     
    readln;
    end.

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    T'es bien gentil mais si tu nous dit pas où ca ne fonctionne pas, on va pas le deviner, surtout pour un code aussi long...
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Hoa,

    J'ignore ce qu'est un tri par interclassement multiple, et Google l'ignore également.

    Si tu as un lien vers un site qui explique de quoi il s'agit, il sera le bienvenu.
    Sinon, l'algorithme en pseudo-code sera utile

    A part cela, j'ai jeté un coup d'oeil rapide :

    - Pour nous faciliter la lecture, supprimer toutes les procédures inutiles aurait été .... utile

    - et voici au moins des trucs qui ne vont pas dans cette procédure (la seule que j'aie regardée jusqu'à présent !)

    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
    procedure tri_intermult(nom1: char);
    { a quoi sert le paramètre nom1,
      inutilisé dans la procédure ? }
    var
      t, t1, t2, ind: ttab;
      fini: boolean;
      i, taille, Min, place: integer;
    begin
      initind(ind, n);
     
      { à quoi cet appel à  tri_quicksort pour chaque
        i de 1 à n ?
     
        AVEC de plus :
         - un tableau t non initialisé
         - une variable taille non initialisée }
     
      for i := 1 to n do
      begin
        tri_quicksort(t, i, taille);
        t1[i] := t[i];
      end;
     
      { par conséquent, à la sortie de la boucle,
         t1 contient n'importe quoi }
     
      fini := FALSE;
      i := 1;
      while (not fini) do
      begin
        chercher_min(t1, ind, Min, place);
        t2[i]      := Min;
        ind[place] := ind[place] + 1;
     
        { ici encore, utilisation de taille,
          variable non initialisée }
     
        if (ind[place] = place * taille) then
          ind[place] := -1;
        fini := tousmoinsun(ind, n);
        i    := i + 1;
      end;
    end;
    Et dans le code principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      tri_intermult('0');
     
      Writeln('voici le trie : ');
      Readln;
     
      for r := 1 to n do
        Writeln(t2[r]);
    Le tableau t2 ne contient rien, la procédure tri_intermult travaillant sur une variable locale portant le même nom.

    Enfin, voilà l'ensemble de ton code remis en forme
    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
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    program trii;
     
    // tri par interclassement multiple
     
     
    uses fdelay, crt;
     
    const 
      n = 20;
    type 
      ttab = array[1..n] of integer;
    var 
      r: integer;
      t, t2, t5: ttab;
     
     
    procedure tri_comptage(var t: ttab; var t2: ttab);
    var 
      ind: ttab;
      i, j: integer;
    begin
      for i := 1 to n do
        ind[i] := 1;
      for i := 1 to n do
      begin
        for j := i + 1 to n do
        begin
          if t[i] < t[j] then 
            ind[j] := ind[j] + 1
          else 
            ind[i] := ind[i] + 1;
        end;
      end;
      for i := 1 to n do
        t2[ind[i]] := t[i];
    end;
     
    procedure tri_bulles(var t: ttab; var t2: ttab);
    var 
      i, j, x: integer;
      permu: boolean;
    begin
      i := 1;
      permu := TRUE;
      begin
        while (permu = TRUE) do
        begin
          permu := FALSE;
          for j := 1 to n - 1 do
          begin
            if t[j] > t[j + 1] then 
            begin
              x := t[j];
              t[j] := t[j + 1];
              t[j + 1] := x;
              permu := TRUE;
            end;
          end;
        end;
      end;
      for j := 1 to n do
        t2[j] := t[j];
    end;
     
    procedure rechercher(var t: ttab; var place: integer; elem: integer; var nbelem: integer);
    var 
      k: integer;
      arret: boolean;
    begin
      k := 1;
      arret := FALSE;
      place := nbelem;
      while (not arret) and (k < nbelem) do
      begin
        if t[k] < elem then 
          k := k + 1
        else 
        begin
          place := k;
          arret := TRUE;
        end;
      end;
    end;
     
    procedure inserer(var t2: ttab; plac: integer; nbirelem: integer; Max: integer);
    var 
      i: integer;
    begin
      for i := Max to plac + 1 do
        t2[i] := t2[i - 1];
      t2[plac] := nbirelem;
    end;
     
    procedure tri_insertion(var t, t2: ttab);
    var 
      y, place: integer;
    begin
      for y := 1 to n do
      begin
        rechercher(t2, place, t[y], y);
        inserer(t2, place, t[y], y);
      end;
    end;
     
     
    procedure initind(var ind: ttab; p: integer);
      {c'est par ici commence le tri par interclassement multiple}
    var 
      i: integer;
    begin
      for i := 1 to p do
        ind[i] := (i - 1) * p;
    end;
     
    function tousmoinsun(var ind: ttab; p: integer): boolean;
    var 
      estvide: boolean;
      i: integer;
    begin
      estvide := TRUE;
      i := 1;
      while (i <= n) and (estvide) do
      begin
        if t[i]<>-1 then 
          estvide := FALSE
        else 
          i := i + 1;
      end;
      tousmoinsun := estvide;
    end;
     
    procedure chercher_min(var t1: ttab; var ind: ttab; var Min, place: integer);
    var 
      i: integer;
    begin
      i := 1;
      while (i <= n) and (ind[i] = -1) do
        i := i + 1;
      place := i;
      Min := ind[place];
      i := i + 1;
      while (i <= n) do
      begin
        if (ind[i] = -1) then 
          i := i + 1
        else 
        begin
          if (ind[i] < Min) then 
          begin
            Min := ind[i];
            place := i;
          end
          else 
            i := i + 1;
        end;
      end;
    end;
     
    procedure segmentation(var t: ttab; bi, bs: integer; var place: integer);
    var 
      pivot, i, j, x: integer;
    begin
      pivot := t[bi];
      i := bi + 1;
      j := bs;
      while (i <= j) do
      begin
        if t[i] < pivot then 
          i := i + 1
        else 
        begin
          if t[i] > pivot then 
            j := j - 1
          else if i < j then 
          begin
            x := t[i];
            t[i] := t[j];
            t[j] := x;
            j := j - 1;
            i := i + 1;
          end;
        end;
      end;
      x := t[bi];
      t[bi] := t[j];
      t[j] := x;
      place := j;
    end;
     
    procedure tri_quicksort(var t: ttab; bi, bs: integer);
    var 
      place: integer;
    begin
      if bi < bs then 
      begin
        segmentation(t, bi, bs, place);
        tri_quicksort(t, bi, place - 1);
        tri_quicksort(t, place + 1,bs);
      end;
    end;
     
    procedure tri_intermult(nom1: char);
    var 
      t, t1, t2, ind: ttab;
      fini: boolean;
      i, taille, Min, place: integer;
    begin
      initind(ind, n);
      for i := 1 to n do
      begin
        tri_quicksort(t, i, taille);
        t1[i] := t[i];
      end;
      fini := FALSE;
      i := 1;
      while (not fini) do
      begin
        chercher_min(t1, ind, Min, place);
        t2[i]      := Min;
        ind[place] := ind[place] + 1;
        if (ind[place] = place * taille) then 
          ind[place] := -1;
        fini := tousmoinsun(ind, n);
        i    := i + 1;
      end;
    end;
     
    {et c'est ici ou ce termine}
     
     
    begin
      clrscr;
     
      Writeln('tapez entrer pour commencer le random ');
      Readln;
     
     
      Randomize;
      for r := 1 to n do
      begin
        t[r] := Random(n);
        Writeln(t[r]);
      end;
     
    {tri_comptage(t,t2);
     
    tri_bulles(t,t2);
     
    tri_insertion(t,t2); }
     
      tri_intermult('0');
     
      Writeln('voici le trie : ');
      Readln;
     
      for r := 1 to n do
        Writeln(t2[r]);
     
      Readln;
    end.
    Si les cons volaient, il ferait nuit à midi.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 32
    Points
    32
    Par défaut
    ca marche encore pas,
    le programme devrait affiché les nombres tries, mais il tourne dans une boucle nfinie, et tu verrais ca de t'es yeux si tu l'a exécuté,
    et pourrait l'explication du principe du tri c'est presque impossible de l'expliqué comme ca, mais je vais faire de m'en mieux pour l'expliquer, alors attender l'explication .

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Laj,
    Citation Envoyé par moncef357
    ca marche encore pas,
    le programme devrait affiché les nombres tries, mais il tourne dans une boucle nfinie, et tu verrais ca de t'es yeux si tu l'a exécuté,
    et pourrait l'explication du principe du tri c'est presque impossible de l'expliqué comme ca, mais je vais faire de m'en mieux pour l'expliquer, alors attender l'explication .
    Je ne compte pas essayer de l'exécuter, il y a des erreurs manifestes que je t'ai signalées.

    A partir de là, je ne cherche même pas à compiler.
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 32
    Points
    32
    Par défaut
    tri par interclassement multiple c'est un tri externe
    ce qu'il fait :
    1) je divise le fichier en p morceau
    2) j'utilise un index(tableau qui contiendra les indices debut de chaque morceau)
    3) je choisi p en fonction de la taille du fichier et la taille de memoire disponible
    4) pour chaque morceau:
    - je le charge en memoire
    - je le tri avec un tri rapide (quicksort)
    - et puis le ramene a ca place
    5) a la fin je me retrouve avec un ensemble de sous fichiers tries
    6) j'applique l'interclassement multiple sur l'ensemble de sous fichiers

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Moj,
    Citation Envoyé par moncef357
    tri par interclassement multiple c'est un tri externe
    ce qu'il fait :
    1) je divise le fichier en p morceau
    2) j'utilise un index(tableau qui contiendra les indices debut de chaque morceau)
    3) je choisi p en fonction de la taille du fichier et la taille de memoire disponible
    4) pour chaque morceau:
    - je le charge en memoire
    - je le tri avec un tri rapide (quicksort)
    - et puis le ramene a ca place
    5) a la fin je me retrouve avec un ensemble de sous fichiers tries
    6) j'applique l'interclassement multiple sur l'ensemble de sous fichiers
    Bien, je verrai, mais pas avant que tu aies revu/corrigé ton code, qui en l'état, ne peut pas marcher.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 32
    Points
    32
    Par défaut
    mais pas avant que tu aies revu/corrigé ton code, qui en l'état, ne peut pas marcher.
    c'est parce qu'il n'est pas en etat de marcher c'est pour ca je demande de l'aide, si je savais aussi où est le probleme je l'aurais reparer, mais moi je vois pa d'erreur

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Ao,
    Citation Envoyé par moncef357
    c'est parce qu'il n'est pas en etat de marcher c'est pour ca je demande de l'aide, si je savais aussi où est le probleme je l'aurais reparer, mais moi je vois pa d'erreur
    Dans ma réponse où j'ai mis du code, il y a entre autres le code de la procédure tri_intermult, avec en commentaire mes remarques.

    Il faut faire l'effort de lire les réponses.
    Si les cons volaient, il ferait nuit à midi.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 32
    Points
    32
    Par défaut
    j'ai modifier le code vous devez voir

Discussions similaires

  1. fonction de tri par introspection
    Par ned-flanders dans le forum C++
    Réponses: 7
    Dernier message: 21/10/2004, 11h49
  2. [ XML ][ XSL ] tri par date
    Par zozolh2 dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/08/2004, 10h19
  3. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  4. Tri par ordre alphabétique
    Par orus8 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/04/2003, 19h27
  5. Tri par fusion d'un tableau
    Par Mailgifson dans le forum C
    Réponses: 5
    Dernier message: 12/12/2002, 14h53

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