Documente Academic
Documente Profesional
Documente Cultură
Cap5 PDF
Cap5 PDF
ierelor
5. SORTAREA !I INTERCLASAREA FI!IERELOR
BINARE MEMORATE DENS
Opera"ia de sortare a unui fi!ier binar presupune aranjarea articolelor n ordinea cresc#toare
(descresc#toare) a valorilor unei zone, numit# cheie de sortare. n cazul n care cheia de sortare este
format# dintr-un singur cmp din cadrul articolului, opera"ia se nume!te sortare simpl". Sortarea
multipl" presupune aranjarea articolelor dup# valorile a dou# sau mai multe cmpuri, alc#tuind, prin
juxtapunere, cheia de sortare. Juxtapunerea cmpurilor (nu neap#rat adiacente n cadrul articolului) se
realizeaz# pe lungimea efectiv# a lor, alc#tuind forma canonic" a cheii de sortare. De exemplu, dac#
nume !i prenume sunt dou# cmpuri distincte, declarate de tip STRING, forma canonic# a cheii de
sortare dup# nume !i prenume este dat# de lungimea efectiv# a fiec#rei date de tip !ir.
Dac# pentru sortarea simpl# cheia poate fi nsu!i cmpul din articol, pentru cea multipl# este
necesar# o zon# auxiliar# de memorie, n care se construie!te cheia de sortare, n forma canonic#.
Sortarea unui fi!ier se poate realiza cu aducerea lui integral# n memorie (sortare n memorie)
sau cu aducerea n memorie a cte unui articol (sortare "direct pe disc"). Indiferent de modul utilizat,
sortarea poate fi realizat# printr-unul din algoritmii cunoscu"i pentru masivele de date: sortare prin
interschimbare, prin selec"ie, prin inser"ie etc.
Sortarea n memorie este o metod# rapid# !i presupune: citirea ntregului fi!ier n memoria
principal#; sortarea efectiv# dup# cheia de sortare; recrearea fi!ierului pe disc. Metoda se poate aplica
numai fi!ierelor reduse ca dimensiuni sau cu lungime mic# de articol, dat# fiind capacitatea limitat# a
memoriei interne asociat# unui program. Ea poate avea mai multe variante:
Sortarea cu vehicularea ntregului articol presupune memorarea ntregului fi!ier ntr-un
vector de articole. Compararea pentru sortare se va realiza pe cmpul cheie de sortare, ns#
interschimbarea se realizeaz# la nivelul ntregului articol.
Exemplu:
Program sortare_$;
type
art=record
grupa:byte;
nume_student:string[30];
medie:real;
end;
var
f:file of art; x:array[$..250] of art;
i,j,n:byte; aux:art;
begin
assign(f,'student.dat'); reset(f):
n:=filesize(f):
for i:=$ to n do read (f,x[i]); {citirea fisierului
initial in memorie}
for i:=$ to n-$ do
for j:=i+$ to n do
if x[i].medie < x[j].medie then
begin
aux:=x[i];
x[i]:=x[j];
x[y]:=aux
end;
close(f); rewrite(f);
for i:=$ to n do write(f,x[i]);
close (f)
Algoritmi !i programe de prelucrare a fi!ierelor
end.
Sortarea cu vehicularea cheii !i indexului, presupune memorarea ntr-un vector numai a
valorii cheii de sortare, mpreun# cu num#rul relativ al articolului din fi!ierul ini"ial (indexul).
Interschimbarea se va realiza la nivelul cheii de sortare, rezultnd n final ordinea n care articolele vor
fi scrise n fi!ier. Deoarece articolele, n ntregime, sunt rezidente pe disc, fi!ierul sortat va fi creat cu
un alt nume fizic, n acces secven"ial, prelund articolele din fi!ierul ini"ial, n acces direct. Cheile de
sortare !i indexurile pot fi memorate n vectori distinc"i sau ntr-unul singur, cu elemente de tip articol.
Exemplu:
program sortare_2;
type
art=record
grupa:byte;
nume_student:string[30];
medie:real;
end;
art_cheie=record
medie:real;
index:byte
end;
var
f,g:file of art; y:art; aux:art_cheie;
x:array[$..250] of art_cheie;
i,j,n:byte;
begin
assign(f,'student.dat'); reset(f);
assign(g,'students.dat'); rewrite(g);
n:=filesize(f):
(* ---------------------------------- *)
for i:=$ to n do
begin
read(f,y);
x[i].medie:=y.medie;
x[i].index:=i-$;
end;
(*-------------------------------------*)
for i:=$ to n-$ do
for j:=i+$ to n do
if x[i].medie <x[j].medie then
begin
aux:=x[i];
x[i]:=x[j];
x[j]:=aux
end;
(*--------------------------------------*)
for i:=$ to n do
begin
seek(f,x[i].index);
read(f,y);
write(g,y)
end;
Algoritmi !i programe de prelucrare a fi!ierelor
close(f); close(g)
end.
Sortarea numai cu vehicularea indexului este o metod# mai bun# dect precedenta, deoarece
mic!oreaz# timpul de execu"ie, prin eliminarea interschimb#rii valorilor cheii de sortare (mai ales cnd
aceasta este multipl#). Valorile cheii de sortare !i a num#rului relativ corespunz#tor indexului se
memoreaz# n vectori distinc"i. Compara"iile se realizeaz# pentru valorile cheii, dar interschimbarea se
efectueaz# numai pentru indexuri. Se va crea un alt fi!ier fizic.
Exemplu:
program sortare_3;
type
art=record
grupa:byte;
nume_student:string[30];
medie:real;
end;
var
f,g:file of art;
x:array[$..250] of real;
index:array[$..250] of byte;
i,j,n,aux:byte;
y:art;
begin
assign(f,'student.dat'); reset(f);
assign(g,'students.dat'); rewrite(g);
n:=filesize(f);
(*------------------------------------------ *)
for i:=$ to n do
begin
read(f,y);
x[i]:=y.medie;
index[i]:=i-$
end;
(* ------------------------------------------ *)
for i:=$ to n-$ do
for j:=i+$ to n do
if x[index[i]] < x[index[j]] then
begin
aux:=index[i];
index[i]:=index[j];
index[j]:=aux
end;
(* ------------------------------------------- *)
for i:=$ to n do
begin
seek(f,index[i]);
read(f,y);
write(g,y)
end;
close(f); close(g)
end.
Algoritmi !i programe de prelucrare a fi!ierelor
Sortarea pe disc se aplic# fi!ierelor mari, la care este imposibil# aducerea n memoria
principal# chiar !i a minimului de informa"ii necesare sort#rii. n acest caz, opera"ia se va realiza
"direct" pe mediul magnetic, cu aducerea n memorie doar a dou# articole (pentru compara"ii) !i
scrierea n acces direct n acela!i fi!ier, prin utilizarea num#rului relativ al articolelor prelucrate.
Timpul de prelucrare va fi substan"ial mai mare dect la metodele de sortare n memorie, deoarece
opera"iile de intrare/ie!ire sunt costisitoare din punct de vedere al resursei timp calculator. Se poate
aplica oricare din algoritmii de sortare cunoscu"i, cu men"iunea c# indicii i !i j din structurile repetitive
vor fi utiliza"i pentru controlul num#rului relativ al articolelor n fi!ier.
Exemplu:
a) Sortarea prin interschimbare
repeat
vb:=false;
for i:=$ to filesize(f)-$ do
begin
seek(f,i-$); read(f,x,y);
if x.medie < y.medie then
begin
seek(f,i-$);
write(y,x);
vb:=true
end
end
until not vb;
..
b) Sortare prin selec"ie