Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: rasto93 10. 04. 2010, 14:47:38

Název: Jak naprogramovat heapsort v Pascalu
Přispěvatel: 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:
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
Název: Re: Heapsort - Pascal
Přispěvatel: Martin 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);
Název: Re: Heapsort - Pascal
Přispěvatel: rasto93 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
Název: Re: Jak naprogramovat heapsort v Pascalu
Přispěvatel: Ladislav 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ě.
Název: Re: Jak naprogramovat heapsort v Pascalu
Přispěvatel: rasto93 18. 04. 2010, 15:38:07
Mělo by stačit to pole prostě předat odkazem, stejně jako ty parametry.
Akym odkazom?
Název: Re: Jak naprogramovat heapsort v Pascalu
Přispěvatel: Ladislav 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.
Název: Re: Jak naprogramovat heapsort v Pascalu
Přispěvatel: rasto93 24. 04. 2010, 10:51:57
Dik. Uz to slape ako hodinky.
Název: Re:Jak naprogramovat heapsort v Pascalu
Přispěvatel: Zdeno Sekerák 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
Název: Re:Jak naprogramovat heapsort v Pascalu
Přispěvatel: _Jenda 03. 04. 2026, 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)