Referat autorstwa Pawła Pełszyńskiego, ucznia klasy II Ti, na temat sortowania tablic w programie Pascal.
Sortowanie szybkie(ang. quicksort) – jeden z popularnych algorytmów sortowania działających na zasadzie "dziel i zwyciężaj".
PROCEDURE Quicksort (VAR A : tab; l,r: INTEGER);
VAR
pivot,b,i,j : INTEGER;
BEGIN
IF l < r THEN
pivot := A[random(r-l) + l+1]; { losowanie elementu dzielącego }
i := l-1;
j := r+1;
REPEAT
REPEAT i := i+1 UNTIL pivot <= A[i];
REPEAT j := j-1 UNTIL pivot >= A[j];
b:=A[i]; A[i]:=A[j]; A[j]:=b
UNTIL i >= j;
A[j]:=A[i]; A[i]:=b;
Quicksort(A,l,i-1);
Quicksort(A,i,r)
END
END;
Wywoływanie dla tablicy o długości n: quicksort(tablica,1,n);.
Sortowanie przez kopcowanie
program heap_sort;
uses crt;
type
Wsk = ^TLiczba;
TLiczba = record
dane : integer;
lewy, prawy : Wsk;
end;
const N = 20;
var
d : array[1..N] of integer;
i,j,l,poz : integer;
korzen, tmp, poprz, akt : Wsk;
PROCEDURE WstawTabliceDoDrzewa(k : integer);
begin
l:=1;{odpowiada za przemienne wstawianie do prawej i lewej galezi}
{tworzenie drzewa}
New(korzen); {pierwszy element}
korzen^.dane:=d[1];
korzen^.lewy:=nil;
korzen^.prawy:=nil;
for i := 2 to k do
{wstawiamy na wierzcholek}
if d[i]>korzen^.dane then
tmp:=korzen;
New(korzen);
korzen^.dane:=d[i];
if l=1 then
korzen^.lewy:=tmp;
l:=0;
if l=0 then
korzen^.prawy:=tmp;
l:=1;
end ;
if d[i]<=korzen^.dane then
tmp:=korzen^.lewy;
while d[i]<tmp^.dane do {szukam miejsca gdzie wstawic kolejny element po lewej}
poprz:=tmp;
tmp:=tmp^.lewy;
New(akt); {wstawiam element}
akt^.dane:=d[i];
akt^.lewy:=tmp;
akt^.prawy:=nil;
poprz^.lewy:=akt;
write(i);
tmp:=korzen^.prawy;
while d[i]<tmp^.dane do {szukam miejsca gdzie wstawic kolejny element po prawej}
tmp:=tmp^.prawy;
akt^.prawy:=tmp;
akt^.lewy:=nil;
poprz^.prawy:=akt;
end;end;
end;{koniec procedury wstawiania do drzewa}
PROCEDURE WstawDrzewoDoTablicy(wstawiany:Wsk);
d[poz]:=wstawiany^.dane;
poz:=poz+1;
if wstawiany^.lewy<>nil then
WstawDrzewoDoTablicy(wstawiany^.lewy);
if wstawiany^.prawy<>nil then
WstawDrzewoDoTablicy(wstawiany^.prawy);
dispose(wstawiany);
end;{koniec wstawiania drzewa do tablicy}
clrscr;
writeln;
writeln('Przed sortowaniem:'); writeln;
{wstawianie elementów losowych do tablicy}
randomize;
for i := 1 to N do
d[i] := random(100); write(d[i] : 4);
for j:=0 to N-1 do {czesc odpowiedzialna za sortowanie}
WstawTabliceDoDrzewa(N-j); {wstawiam N-j pierwszych elementów do drzewa reszta jest juz posortowana}
poz:=1;
write(j);
d[N-j]:=korzen^.dane; {wstawiam najwyzszy element z wierzcholka drzewa na poczatek posortowanej czesci tablicy}
if korzen^.lewy<>nil then
WstawDrzewoDoTablicy(korzen^.lewy);{wstawiam lewa czesc drzewa z powrotem do tablicy}
if korzen^.prawy<>nil then
WstawDrzewoDoTablicy(korzen^.prawy);{wstawiam prawa czesc drzewa z powrotem do tablicy}
dispose(korzen);
writeln('Po sortowaniu:'); writeln;
for i := 1 to N do write(d[i] : 4);
readln;
writeln('Nacisnij Enter...');
end.
Sortowanie przez wybór
const N = 20; var d : array[ 1..N ] of real; i,j,pmin : integer; pomoc:real; begin randomize; for i := 1 to N do d[ i ] := random(100)/10+1; writeln('Przed sortowaniem:'); writeln; for i := 1 to N do write(d[ i ] : 4:2,' '); writeln; for j := 1 to N - 1 do begin pmin := j; for i := j + 1 to N do if d[ i ] < d[ pmin ] then pmin := i; pomoc := d[ pmin ]; d[ pmin ] := d[ j ]; d[ j ] := pomoc; end; writeln('Po sortowaniu:'); writeln; for i := 1 to N do write(d : 4:2,' '); writeln; writeln('Nacisnij Enter...'); readln; end.
2
Toudi