pascal triedenie

Programovacie jazyky, rady, poradňa...
kami171
Amateur
Amateur
Príspevky: 34
Registrovaný: 30 dec 2005, 1:39
Kontaktovať používateľa:

pascal triedenie

Príspevok od používateľa kami171 »

Potreboval by som pomoc s algoritmom Mergesort. Ked nastavim viac ako 5000 prvkou, tak vyhodi chybu, ale tak by mi stacilo aj 5000, ale aj tak to nejak nejde, stale mi vypise ze to spravilo za 0 sek. maxsort mi ide v pohode. za pomoc vopred dakujem.

Kód: Vybrať všetko

program triedenie;
uses crt,dos;
const n=5000;

type pole = array[1..N] of integer;
var A,B : pole;
    h,m,s,ss,h1,m1,s1,ss1: word;
    time: longint;
    cas1,cas2: real;

  procedure zacni;
  var h, m, s : word;
  begin
    GetTime(h,m,s,ss);
    Time := h * 3600 + m * 60 + s;
  end;

function koniec: real;

  var h, m, s, ss1 : word;
  begin
    GetTime(h, m, s, ss1);
    koniec := h * 3600 + m * 60 + s - Time + (integer(ss1) -integer(ss)) / 1000;
  end;


procedure vytvor_pole;  {Vytvori nahodny vektor N cisiel}
  var i : integer;
  begin
    Randomize;
    for i := 1 to N do A[i] := Random(4000);
    for i := 1 to N do B[i] := A[i];
  end;



procedure max_sort;
var i,j,m,x:integer;
begin
for i:=n downto 2 do
  begin
    m:=1;
    for j:=2 to i do
      if a[j]>a[m] then m:=j;
    if i<>m then
      begin
        x:=a[m]; a[m]:=a[i]; a[i]:=x;
      end
  end;
end;


procedure Merge;
var i, j, k,p,q,r: integer;
var B: pole;
begin { Merge }
i := p;
j := q + 1;
k := p;
while ((i <= q) and (j <= r)) do
begin
if (A[i] < A[j])
then begin
B[k] := A[i];
i := i + 1;
end
else begin
B[k] := A[j];
j := j + 1;
end;
k := k + 1;
end;
while (i <= q) do
begin
B[k] := A[i];
k := k + 1;
i := i + 1;
end;
while (j <= r) do
begin
B[k] := A[j];
k := k + 1;
j := j + 1;
end;
for k := p to r do A[k] := B[k];
end;


begin
clrscr;
vytvor_pole;
zacni;
max_sort;
cas1:=koniec;
writeln ('cas max sortu je',cas1:6:3,' sekund');
zacni;
merge;
cas2:=koniec;
writeln ('cas merge sortu je' , cas2:6:3,' sekund');

readln;
end.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

k tým veľkým poliam je pekná diskusia tu: http://www.hojko.com/pascal-rozsah-pola-t118270.html tam sa dozvieš prečo nemôžeš použiť také veľké pole

k tým časom: ten merge to zotriedi skôr ako za jednu stotinu sekundy, preto ti výjde nula. Ak si tam dáš nejaký delay (napríklad delay(50) medzi merge a cas2:=koniec;) tak uvidíš že tento delay spolu s triedením bude 6 stotín sekundy. 5 stotín zadržal delay, 6. stotina vznikla zaokrúhlením milisekúnd z triedenia. V súvislosti s týmto (ako píšem o stotinách) si môžeš všimnúť že tam v koniec delíš 1000 pričom gettime ti dá najpresnejšie stotiny. Čiže máš zlé výslekdy, treba to deliť iba 100. Výslekdy sú v stotinách, a nie tisícinach
kami171
Amateur
Amateur
Príspevky: 34
Registrovaný: 30 dec 2005, 1:39
Kontaktovať používateľa:

Príspevok od používateľa kami171 »

no s delay som to uz skusal, ale sa mi zdalo ze to nemam byt az take rychle :roll: takze ti dakujem pekne :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

V tom tvojom príklade spôsobuje problém to, že si alokuješ jedno pole na zásobníku; konkrétne vo funkcii Merge. Ak sa nemýlim, tak zásobník je štandardne dosť malý (alebo aj nie, keďže si nenapísal, akú chybu ti to píše).
kami171
Amateur
Amateur
Príspevky: 34
Registrovaný: 30 dec 2005, 1:39
Kontaktovať používateľa:

Príspevok od používateľa kami171 »

no pri merge vypise error 202: Stack overflow error, ale nevadi staci mi aj mensi pocet prvkov.
Napísať odpoveď