Program rendezesek;                              {rendezes.pas: 90.11.07}

(*

  A Minimumkiválasztásos rendezés működésének

  vizsgálata:

  mozgatások "elméleti" minimuma/maximuma és

             tényleges száma,

             valamint átlagos értéke véletlenszerű sorozatokra.

*)

Uses

     Newdelay,Crt;

Const

     Meret=100;     {a rendzendő elemek száma}

     Ism=100;       {a rendezés ismétlések száma

                     az átlagos hatékonyság "méréséhez"}

Type

     TElem  = Integer;

     TIndex = 1..Meret;

     TVektor= Array [TIndex] of TElem;

Var

     a,b : TVektor; {a rendezendő és a tartalék sorozat}

     rsz,           {rendezések ismétlési száma}

     csdb: LongInt; {elemcserék v. mozgatások száma}

     sz  : String;

     atl : Real;

     c   : Char;

     Min,

     Max : LongInt;

 

  Procedure Csere(Var x: TVektor; i,j: TIndex);

    Var

       s : TElem;

  Begin

    s:=x[i]; x[i]:=x[j]; x[j]:=s;

    Inc(csdb,3);

  End; {Csere}

 

  Procedure Egyenes;

    Var

       i : TIndex;

  Begin

    For i:=1 to Meret do a[i]:=i;

  End; {Egyenes}

 

  Procedure Forditott;

    Var

       i : TIndex;

  Begin

    For i:=1 to Meret do a[i]:=Meret-i;

  End; {Fordított}

 

  Procedure RND_Permutal(Var x : TVektor);

    Var

       i,j,k : TIndex;

  Begin

    For i:=1 to Meret do

    Begin

      j:=Random(Meret)+1; Csere(x,j,i);

    End;

    For i:=1 to Meret do

    Begin

      j:=Random(Meret)+1; k:=Random(Meret)+1; Csere(x,j,k);

    End;

  End; {RND_Permutal}

 

  Procedure Rendez(Var x : TVektor);

    Var

       i,j : TIndex;

       mini: TIndex;

       min : TElem;

  Begin

    csdb:=0;

    For i:=1 to Meret-1 do

    Begin

      mini:=i; min:=x[i]; Inc(csdb);

      For j:=i+1 to Meret do

      Begin

        If x[j]<min then

        Begin

          mini:=j; min:=x[j]; Inc(csdb);

        End;

      End;

      x[mini]:=x[i]; x[i]:=min; Inc(csdb,2);

    End

  End; {Rendez}

 

  Procedure EredmenyKiiras(cim: String; x : TVektor);

    Var

        i : TIndex;

  Begin

    ClrScr; Writeln(cim); GotoXY(1,5);

    Writeln('Mozgatások száma:',csdb);

    atl:=((rsz-1)*atl+csdb)/rsz;

    Writeln(' Átlag:',atl:6:2);

    Writeln(' Elméleti minimum:',Min:5);

    Writeln('   - " -  maximum:',Max:5);

{    Sound(1720); Delay(50);}

    While Keypressed do

    Begin

      Delay(200);

      For i:=1 to Meret do Write(x[i]:4);

      Readln;

    End;

    NoSound;

  End; {EredmenyKiiras}

 

Begin

  Randomize;

  {elméleti mozgatás-szám:}

  Min:=3*Meret-3; Max:=3*Meret-3+Meret*Meret div 4;

  atl:=0;

  rsz:=1; {rendezésszám az 'egyenes' és a 'fordított' esethez}

  Egyenes;   b:=a; Rendez(b); EredmenyKiiras('Egyenes sorrend',a);

  ReadKey;

  Forditott; b:=a; Rendez(b); EredmenyKiiras('Fordított sorrend',a);

  ReadKey;

  For rsz:=1 to Ism do

  Begin

    Str(rsz:2,sz);

    RND_Permutal(b); a:=b; Rendez(b); EredmenyKiiras('Random '+sz,a);

    Delay(300); {lassítás}

  End;

  c:=ReadKey

End.