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.
-
Sort Trmax, Buble, Bublesort in pasca
https://www.trsek.com/cover/koupy/sorter
Třídící algoritmy InsertionSort, BubbleSort, ShakerSort, SelectionSort, HeapSort, MergeSort, QuickSort
https://www.trsek.com/en/pas/trieden
-
Dotaz je z roku 2010, na vršek fóra ho vytáhl spammer, který byl mezitím smazán.
Poznáš to tak, že dneska by už takový dotaz na fóru nepadl, protože by mu odpovědělo LLM. (a taky se už snad nikde neprogramuje v Pascalu)