Jak naprogramovat heapsort v Pascalu

rasto93

Jak naprogramovat heapsort v Pascalu
« kdy: 10. 04. 2010, 14:47:38 »
Cawte,

som zaciatocnik a mam problem napisat Heapsort v pascale. Ked vlozim vstup do mojho programu,tak mi to vrati cisla presne v takom poradi v akom som ich tam vlozil. Tu je moj kod:
Kód: [Vybrat]
program sort;
var i,N:longint;
    a:array[1..999999] of longint;

procedure vymen(x,y:longint);
var z:longint;
begin z:=x;x:=y;y:=z;end;

procedure hore(i:longint);
begin
 while (i>1) and (a[i]<a[i div 2]) do begin
  vymen(a[i div 2],a[i]);i:=i div 2;
 end;
end;

procedure dole(N:longint);
var i,j:longint;
begin
 vymen(a[1],a[N]);dec(N);i:=1;
 while true do begin
  j:=i;
  if (2*i<=N) and (a[2*i]<a[j]) then j:=2*i;
  if (2*i+1<=N) and (a[2*i+1]<a[j]) then j:=2*i+1;
  if j=i then break;
  vymen(a[i],a[j]);i:=j;
 end;
end; 
 
BEGIN
 readln(N);
 for i:=1 to N do read(a[i]);
 for i:=2 to N do hore(i);
 for i:=N downto 2 do dole(i);
 for i:=1 to N do write(a[i],' ');writeln();
END.


Dik za pomoc
« Poslední změna: 11. 04. 2010, 09:37:36 od Petr Krčmář »


Martin

Re: Heapsort - Pascal
« Odpověď #1 kdy: 10. 04. 2010, 17:11:56 »
Procedura vymen je neucinna, lebo pouzivas volanie hodnotou.

Musis pouzit volanie odkazom, aby sa ti zmenili premenne mimo proceduru:

procedure vymen( var x: longint, var y:longint);

rasto93

Re: Heapsort - Pascal
« Odpověď #2 kdy: 16. 04. 2010, 16:47:49 »
Procedura vymen je neucinna, lebo pouzivas volanie hodnotou.

Musis pouzit volanie odkazom, aby sa ti zmenili premenne mimo proceduru:

procedure vymen( var x: longint, var y:longint);

aha dik. A este ako by to priblicne vyzeralo,ked by som chcel,aby som iba kratkym volanim zavolal hore() a dole() a ono by to urobilo pre hocijake pole. Teraz to robi pre pole a[] a ked by som chcel viacej poli v mojom programe posortit.

Dik za odpovede

Ladislav

Re: Jak naprogramovat heapsort v Pascalu
« Odpověď #3 kdy: 17. 04. 2010, 15:15:06 »
Mělo by stačit to pole prostě předat odkazem, stejně jako ty parametry. Pro jistotu bych ale na to

Kód: [Vybrat]
array[1..999999] of longint;
definoval typ, tj.

Kód: [Vybrat]
type
  TMojePole = array[1..999999] of longint;

kvůli assign compatibility, překladač by mohl dělat problémy. Jinak je taky možnost předat ukazatel na to pole (^TMojePole), to by mělo fungovat zcela jistě.

rasto93

Re: Jak naprogramovat heapsort v Pascalu
« Odpověď #4 kdy: 18. 04. 2010, 15:38:07 »
Mělo by stačit to pole prostě předat odkazem, stejně jako ty parametry.
Akym odkazom?


Ladislav

Re: Jak naprogramovat heapsort v Pascalu
« Odpověď #5 kdy: 18. 04. 2010, 19:30:42 »
Kód: [Vybrat]
procedure hore(var pole: TMojePole; i: longint);
begin
 while (i>1) and (pole[i]<pole[i div 2]) do begin
  vymen(pole[i div 2],pole[i]);i:=i div 2;
 end;
end;

Ostatní procedury analogicky, nahradit "a" předanou proměnnou.

rasto93

Re: Jak naprogramovat heapsort v Pascalu
« Odpověď #6 kdy: 24. 04. 2010, 10:51:57 »
Dik. Uz to slape ako hodinky.