Pascal Tri fusion en pascal
Lilila
-
chahbane -
chahbane -
Bonjour,
Je dois réaliser une fonction permettant de trier dans l'ordre croissant un tableau par la méthode du tri par fusion.
Seulement lorsque j'éxécute mon code, le tableau n'est pas trié ...
Merci de m'aider :
où
et
Merci d'avance
Je dois réaliser une fonction permettant de trier dans l'ordre croissant un tableau par la méthode du tri par fusion.
Seulement lorsque j'éxécute mon code, le tableau n'est pas trié ...
Merci de m'aider :
procedure TRFusC ({R} n, i, j: integer; {M} var t : TReleve); Var t2: TReleve; d,m,k,x,y: integer; begin d:=n; m:=(i+1); k:=j; while ( (d<=i) and (k<=n)) do begin if (t[d].tempMax<T[m].tempMax) then begin t2[k]:=t[d]; d:=d+1; end else begin t2[k]:=t[m]; m:=m+1; end; k:=k+1; end; if (d>i) then begin for x:=m to j do begin t2[k]:=t[x] ; k:=k+1 ; end; end; if (m>j) then begin for x:=d to i do begin t2[k]:=t[x] ; k:=k+1; end; end; for y:=j to n do begin t[y]:=t2[y]; end; end; procedure TRTriFusC ({R} n : integer; {M} var t : TReleve); var p,k:integer; begin p := 1; while p < n do begin k := 1; while k+p < n do begin TRFusC(k, k+p-1, MinInteger(k+2*p-1, n), t); k := k+2*p end; p := 2*p end; end;
où
TReleve = array[1..366] of Releve;
et
type Releve = record annee : integer ; mois : 1..12; jour : 1..31; tempMax : real ; tempMin : real ; precipitation : real ; ensoleillement : real ; end;
Merci d'avance
A voir également:
- Tri fusion pascal
- Turbo pascal - Télécharger - Édition & Programmation
- My pascal - Télécharger - Édition & Programmation
- Comment faire un tri personnalisé sur excel - Guide
- Dev pascal - Télécharger - Édition & Programmation
- Logiciel tri photo - Guide
2 réponses
c'est peut etre que tu as alloue 366 Releves!!!! c'est trooop!! essaye toujours d'allouer au plus 10 elements (surtout si ils sont du type enregistrement ou chaines de caracteres). c'est un defaut pour le pascal. mais je vous propose une autre fonction recursive qui tri par fusion, un tableau des entiers, vous pouvez le modifier!
procedure fusionner_rec (var t:tab; tmp:tab; deb,fin:integer);
var m:integer;
procedure fusion (var t:tab; tmp:tab; d,m,f:integer);
var i,j,k:integer;
begin
i:=d;
j:=m+1;
for k:=d to f do
if ((j>f) or ((j<=m) and (t[i]<t[j]))) then
begin
tmp[k]:=t[i];
i:=i+1
end
else
begin
tmp[k]:=t[j];
j:=j+1;
End;
for k:=d to f do
t[k]:=tmp[k];
end;
begin
if deb<fin then
begin
m:=(deb+fin) div 2;
fusionner_rec(t,tmp,deb,m);
fusionner_rec(t,tmp,m+1,fin);
fusion(t,tmp,deb,m,fin);
end;
end;
procedure fusionner_rec (var t:tab; tmp:tab; deb,fin:integer);
var m:integer;
procedure fusion (var t:tab; tmp:tab; d,m,f:integer);
var i,j,k:integer;
begin
i:=d;
j:=m+1;
for k:=d to f do
if ((j>f) or ((j<=m) and (t[i]<t[j]))) then
begin
tmp[k]:=t[i];
i:=i+1
end
else
begin
tmp[k]:=t[j];
j:=j+1;
End;
for k:=d to f do
t[k]:=tmp[k];
end;
begin
if deb<fin then
begin
m:=(deb+fin) div 2;
fusionner_rec(t,tmp,deb,m);
fusionner_rec(t,tmp,m+1,fin);
fusion(t,tmp,deb,m,fin);
end;
end;
Il n'y a aucune raison que la borne 366 de l'array pose problème...
Par contre j'aimerais bien savoir ce que sont les directives {R} et {M} pour savoir si elles n'opéreraient pas une action de recopie auquel cas modifier le tableau est inutile !
Sinon il faudrait regarder le code en détail mais il va falloir mettre des commentaires en particulier sur les valeurs des très nombreuses variables...
Par contre j'aimerais bien savoir ce que sont les directives {R} et {M} pour savoir si elles n'opéreraient pas une action de recopie auquel cas modifier le tableau est inutile !
Sinon il faudrait regarder le code en détail mais il va falloir mettre des commentaires en particulier sur les valeurs des très nombreuses variables...
Ça dépend des compilateurs...
Personnellement avec Dev-Pascal je peux utiliser des variables qui atteignent 4Go de données.
Donc puisque le string est représenté par 256 octets, je peux avoir un tableau avec 8 388 863 string !!!
Et avec le type Releve (codé sur 38 octets), on peut avoir un tableau de 56 512 765 Releves...
Alors avoir 366 ça ne devrait pas poser de problème... Ou alors changez de compilateur !!!
Personnellement avec Dev-Pascal je peux utiliser des variables qui atteignent 4Go de données.
Donc puisque le string est représenté par 256 octets, je peux avoir un tableau avec 8 388 863 string !!!
Et avec le type Releve (codé sur 38 octets), on peut avoir un tableau de 56 512 765 Releves...
Alors avoir 366 ça ne devrait pas poser de problème... Ou alors changez de compilateur !!!