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.

Re:Jak naprogramovat heapsort v Pascalu
« Odpověď #7 kdy: 02. 04. 2026, 21:24:14 »
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

_Jenda

  • *****
  • 1 661
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Jak naprogramovat heapsort v Pascalu
« Odpověď #8 kdy: Dnes v 00:16:00 »
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)