Sunteți pe pagina 1din 6

Algoritmi !i programe de prelucrare a fi!

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

for i:=$ to filesize(f)-$ do


begin
seek(f,i-$); read(f,x);
for j:=i+$ to filesize(f) do
begin
seek(f,j-$); read(f,y);
if x.medie < y.medie then
begin
seek(f,i-$); write(f,y);
seek(f,j-$); write (f,x);
x:=y
end
end
end
..
Interclasarea este opera"ia prin care, din dou# sau mai multe mul"imi ordonate, se ob"ine o
nou# mul"ime, ordonat# dup# acela!i criteriu. Interclasarea fi!ierelor apare ca necesitate n aplica"iile
economice, mai ales n faza de post-populare a fi!ierelor mari de date, create simultan pe submul"imi
de mai mul"i utilizatori !i necesitnd, n final, reunirea acestora ntr-unul singur.
Condi"ia apriori interclas#rii este ca toate fi!ierele ini"iale s# fie sortate dup# valorile aceluia!i
cmp, pe baza c#ruia se va realiza, prin compar#ri succesive, opera"ia de interclasare. Cmpul poart#
Algoritmi !i programe de prelucrare a fi!ierelor
denumirea de cheie de interclasare. Interclasarea a n fi!iere se poate realiza simplu prin aplicarea de n-
1 ori a opera"iei de interclasare a dou# fi!iere (figura 4.$).
1 2 3 4 n
Fi!iere
ini"iale
Fi!ier
intermediar 1
Fi!ier
intermediar 2
Fi!ier
intermediar 3
Fi!ier
intermediar n-1
Fi!ier
final
Interclasare 1
Interclasare 2
Interclasare 3
Interclasare n-1
Fig. 4.1. Interclasarea a n fi!iere
Se ob"in astfel n-1 fi!iere intermediare, din care numai ultimul se p#streaz#, celelalte (mpreun#
cu fi!ierele ini"iale) se !terg, fie n finalul procesului, fie la sfr!itul fiec#rei etape intermediare.
Interclasarea a dou# fi!iere este similar# opera"iei aplicat# pentru doi vectori. Cheia de interclasare
referitoare la un fi!ier va con"ine valoarea din cmpul apar"innd articolului curent. Dac# fi!ierul a fost
parcurs integral, cheia de interclasare coprespunz#toare lui va primi o valoare din afara mul"imii pe
care este definit acel cmp. Valoarea este denumit# n practic# high-value (HV), !i este definit# de
programator. Procesul se ncheie cnd ambele chei de interclasare au valoarea HV. Dimensiunea
fi!ierului rezultat este suma dimensiunilor fi!ierelor ini"iale.
Exemplu:
Se prezint# structura principial# a unui program pentru interclasarea a dou# fi!iere binare, unde
k1 !i k2 sunt zone independente de memorie n care se re"in valorile cheilor de interclasare, memorate
n cmpul c apar"innd articolelor art_1 !i art_2, corespunz#toare fi!ierelor de intrare f1 !i f2,
considerate nevide !i populate dens.
.
begin
(* ---------------------------------
citire nume externe ale fisierelor
--------------------------------- *)
assign(f$,nume_fisier_intrare_$);
reset(f$);
assign(f2,nume_fisier_intrare_2);
reset(f2);
assign(f3,nume_fisier_iesire);
rewrite(f3);
read(f$,art_$);
k$:=art_$.c;
Algoritmi !i programe de prelucrare a fi!ierelor
read(f2,art_2);
k2:=art_2.c;
while (k$ <> hv) or (k2 <> hv) do
if k$ < k2 then
begin
write(f3,art_$);
if eof(f$) then k$:=hv else read(f$,art_$)
end
else
begin
write(f3,art_2);
if eof(f2) then k2:=hv else read(f2,art_2)
end;
close(f$);
close(f2);
close(f3)
end.

S-ar putea să vă placă și