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)
-
Chtěl jsem napsat něco obdobného jako _Jenda: Zda někdo v dnešení době, kdo se "takzvaně naučil programovat" ať už pomocí czechitas (teď byl nějaký oslavný článek na seznam, že nějaká matka na rodičovské to zvládla, akorát kurz python byl pro ní nejhorší část a po 50 CV musela bouchnout do tlačítka na linked in a dělá "do dat" ve velký firmě) nebo rekvalifikačního kurzu z horníka nebo to lusknutím prstu vyložil na stůl z promptu,
-víc co heapsort (rámcově nástroj pro "sort" používající pattern/metodu/konstrukci/ideu "heap" ), znamená (že to není sprosté slovo, název autora nebo náhodné pojmenování),
-ví, že seřazení prvků není jen tlačítko v tabulce v excelu nebo wikipedii(taky) a že konzument koláče má na výběr celý tácek s upečenými algoritmy
-že každý jeden algoritmus pro tutéž úlohu(seřazení) má nějaké složení, jiné výživové údaje (časová a paměťová náročnost, a další)