Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: rasto93 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:
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
-
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);
-
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
-
Mělo by stačit to pole prostě předat odkazem, stejně jako ty parametry. Pro jistotu bych ale na to
array[1..999999] of longint;
definoval typ, tj.
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ě.
-
Mělo by stačit to pole prostě předat odkazem, stejně jako ty parametry.
Akym odkazom?
-
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.
-
Dik. Uz to slape ako hodinky.