Triedenie Trmax, Buble, Bublesort v pascale

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategorija: Programy zos Pascalu

Program: Trieden.pas
Subor exe: Trieden.exe
Subor ubuntu: Trieden

Program ktorý predvedie a porovná 3 spôsoby triedenia čísel.
TRMAX - triedenie cez maximum.
BUBLE - bublikové triedenie.
BUBLESORT - bublinkové s príznakom.
{ TRIED.PAS                 Copyright (c) TrSek alias Zdeno Sekerak }
{ Program ktorý predvedie a porovná 3 spôsoby triedenia čísel.      }
{ TRMAX - triedenie cez maximum.                                    }
{ BUBLE - bublikové triedenie.                                      }
{ BUBLESORT - bublinkové s príznakom.                               }
{                                                                   }
{ Datum:10.04.1998                             http://www.trsek.com }
 
program sposob_triedenia;
uses crt,dos;
const TmpSoub='cisla.txt';
var
    b:array[1..32000]of integer;
    i,j,pom,pr,max,y,pm:integer;
    t1,t2:real;
    k:char;
 
 
{ vygeneruje subor s nahodnymi cislami }
procedure GenerujTxt(max:integer);
var f:text;
    i:integer;
begin
  assign(f,TmpSoub);
  rewrite(f);
{  append(f);}
 
  Randomize;
  for i:= 1 to max do
    Writeln(f,Random(max));
 
  close(f);
end;
 
 
{ precita txt subor a naplni pole }
procedure CitajTxt;
var f:text;
    i:integer;
begin
  assign(f,TmpSoub);
  reset(f);
  i:=0;
 
  while not(eof(f)) do
  begin
    inc(i);
    Readln(f,b[i]);
  end;
 
  close(f);
end;
 
 
{ zisti aky je aktualny cas a vrati pocet milisekund }
function DajCas:real;
var h,mi,s,ss:word;
begin
  gettime(h,mi,s,ss);
  DajCas := (h*3600) + (mi*60) + s + (ss/100);
end;
 
 
{ vypise ako dlho to trvalo a aky je zoznam }
procedure VypisVysledok(txt:string;cas:real);
var i:integer;
begin
  ClrScr;
  Writeln('Zotriedene:');
 
  for i:= 1 to max do
  begin
    Write(b[i]);
    if (i<>max) then Write(',');
  end;
 
  Writeln;
  Writeln;
  Writeln(txt,' trvalo ',cas:5:5,' sekund. (stlac ENTER)');
  Readln;
end;
 
 
{ Hlavny begin }
begin
 y:=2;
 
 Repeat
   Clrscr;
   Gotoxy(1,1);
   Writeln('Vyberte si sp“sob triedenia (ESC-Koniec):');
   Writeln(' TRMAX     - (triedenie cez maximum)');
   Writeln(' BUBLE     - (bublikov‚ triedenie)');
   Writeln(' BUBLESORT - (BUBLE s prĄznakom)');
   Gotoxy(1,y);
   k:=Readkey;
 
   if (k=#80) and (y<6) then begin
     y:=y+1;
     Gotoxy(1,y);
   end;
 
   if (k=#72) and (y>2) then begin
     y:=y-1;
     Gotoxy(1,y);
   end;
 
   {///////// stlacil ENTER, vygeneruje zoznam cisel /////////}
   if (k=#13) then begin
      Clrscr;
      Write('Zadaj pocet cisel:');
      Readln(max);
      GenerujTxt(max);
   end;
 
   {///////// triedenie cez maximum /////////}
   if (k=#13) and (y=2) then
   begin
     { normalne }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     for j:= max downto 2 do begin
       pm:=j;
       for i:= 1 to j do begin
         if b[i]>b[pm] then begin
            pom:=b[i];
            b[i]:=b[pm];
            b[pm]:=pom;pm:=j;
         end;
       end;
     end;
 
     t2:=DajCas;  {cas na konci}
     VypisVysledok('Triedenie cisel',t2-t1);
 
     { zdola nahor }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     for j:= max downto 2 do begin
       pm:=j;
       for i:= 1 to j do begin
         if b[i]>b[pm] then begin
            pom:=b[i];
            b[i]:=b[pm];
            b[pm]:=pom;pm:=j;
         end;
       end;
     end;
 
     t2:=DajCas;  {cas na konci}
     VypisVysledok('Triedenie cisel zdola hore',t2-t1);
 
     { zhora nadol }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     for j:= max downto 2 do begin
       pm:=j;
       for i:= 1 to j do begin
         if b[i]>b[pm] then begin
            pom:=b[i];
            b[i]:=b[pm];
            b[pm]:=pom;pm:=j;
         end;
       end;
     end;
 
     t2:=DajCas;  {dava cas na konci}
     VypisVysledok('Triedenie1 z hora dole',t2-t1);
   end;   { if(y=2) }
 
 
   {///////// triedenie buble /////////}
   if (k=#13) and (y=3) then
   begin
     { normalne }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     for j:= 1 to max-1 do begin
       for i:= 1 to max-1 do begin
           if b[i]>b[i+1] then begin
              pom:=b[i];
              b[i]:=b[i+1];
              b[i+1]:=pom;
           end;
       end;
     end;
 
     t2:=DajCas;  {dava cas na konci}
     VypisVysledok('Triedenie roznych cisel',t2-t1);
 
     { z dola nahor }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     for j:= 1 to max-1 do begin
         for i:= 1 to max-1 do begin
             if b[i]>b[i+1] then begin
                pom:=b[i];
                b[i]:=b[i+1];
                b[i+1]:=pom;
             end;
         end;
     end;
 
     t2:=DajCas;  {dava cas na konci}
     VypisVysledok('Triedenie cisel z dola hore',t2-t1);
 
     { zhora nadol }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     for j:= 1 to max-1 do begin
         for i:= 1 to max-1 do begin
             if b[i]>b[i+1] then begin
                pom:=b[i];
                b[i]:=b[i+1];
                b[i+1]:=pom;
             end;
         end;
     end;
 
     t2:=DajCas;  {dava cas na konci}
     VypisVysledok('Triedenie2 cisel z hora dole',t2-t1);
   end;   { if(y=3) }
 
 
   {///////// triedenie buble s priznakom /////////}
   if (k=#13) and (y=4) then
   begin
     { normalne }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     repeat
       pr:=0;
       for i:= 1 to max-1 do begin
          if b[i]>b[i+1] then begin
             pr:=pr+1;
             pom:=b[i];
             b[i]:=b[i+1];
             b[i+1]:=pom;
          end;
       end;
     until (pr=0);
 
     t2:=DajCas;  {dava cas na konci}
     VypisVysledok('Triedenie roznych cisel',t2-t1);
 
     { zdola nahor }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     repeat
       pr:=0;
       for i:= 1 to max-1 do begin
          if b[i]>b[i+1] then begin
             pr:=pr+1;
             pom:=b[i];
             b[i]:=b[i+1];
             b[i+1]:=pom;
          end;
       end;
     until (pr=0);
 
     t2:=DajCas;  {dava cas na konci}
     VypisVysledok('Triedenie cisel z dola hore',t2-t1);
 
     { zhor nadol }
     CitajTxt;
     t1:=DajCas;  {cas pred spustenim }
     Writeln('Triedim ...');
 
     repeat
       pr:=0;
       for i:= 1 to max-1 do begin
           if b[i]>b[i+1] then begin
              pr:=pr+1;
              pom:=b[i];
              b[i]:=b[i+1];
              b[i+1]:=pom;
           end;
       end;
     until (pr=0);
 
     t2:=DajCas;  {dava cas na konci}
     VypisVysledok('Triedenie3 cisel z hora dole',t2-t1);
   end;   { if(y=4) }
 Until k=#27;
end.