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 câmp din cadrul articolului, opera ţia se numeşte  sortare simpl ă . Sortarea multipl ă presupune aranjarea articolelor dup ă valorile a două sau mai multe câmpuri, alc ătuind, prin  juxtapunere, cheia de sortare. Juxtapunerea câmpurilor (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ă câmpuri 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 câmpul 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 câte 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 câmpul cheie de sortare, îns ă interschimbare a se realizează la nivelul întregului articol. Exemplu: Program sortare_ 1; type art=record grupa:byte; nume_student:string[30]; medie:real; end; var f:file of art; x:array[1..250] of art; i,j,n:byte; aux:art;  begin assign(f,' student.dat'); reset(f): n:=filesize(f): for i:=1 to n do read (f,x[i]); {citirea fisierului initial in memorie} for i:=1 to n-1 do for j:=i+1 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:=1 to n do write(f,x[i]); close (f)

Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

Embed Size (px)

Citation preview

Page 1: Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

8/8/2019 Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

http://slidepdf.com/reader/full/sortarea-si-interclasarea-fisierelor-binare-memorate-dens 1/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 esteformată dintr-un singur câmp din cadrul articolului, operaţia se numeşte   sortare simpl ă . Sortarea

multipl ă  presupune aranjarea articolelor după valorile a două sau mai multe câmpuri, alcătuind, prin juxtapunere, cheia de sortare. Juxtapunerea câmpurilor (nu neapărat adiacente în cadrul articolului) serealizează pe lungimea efectivă a lor, alcătuind forma canonică  a cheii de sortare. De exemplu, dacănume şi  prenume sunt două câmpuri distincte, declarate de tip STRING, forma canonică a cheii desortare 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 câmpul din articol, pentru cea multiplă estenecesar ă 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 câte 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 prininterschimbare, 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 aplicanumai fişierelor reduse ca dimensiuni sau cu lungime mică de articol, dată fiind capacitatea limitată amemoriei interne asociată unui program. Ea poate avea mai multe variante:

• Sortarea cu vehicularea întregului articol  presupune memorarea întregului fişier într-unvector de articole. Compararea pentru sortare se va realiza pe câmpul cheie de sortare, însăinterschimbarea se realizează la nivelul întregului articol.

Exemplu:Program sortare_ 1;type

art=recordgrupa:byte;nume_student:string[30];medie:real;

end;var 

f:file of art; x:array[1..250] of art;i,j,n:byte; aux:art;

 beginassign(f,'student.dat'); reset(f):

n:=filesize(f):for i:=1 to n do read (f,x[i]); {citirea fisieruluiinitial in memorie}

for i:=1 to n-1 dofor j:=i+1 to n do

if x[i].medie < x[j].medie thenbegin

aux:=x[i];x[i]:=x[j];x[y]:=aux

end;

close(f); rewrite(f);for i:=1 to n do write(f,x[i]);close (f)

Page 2: Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

8/8/2019 Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

http://slidepdf.com/reader/full/sortarea-si-interclasarea-fisierelor-binare-memorate-dens 2/6

 Algoritmi  şi programe de prelucrare a fi  şierelor 

end.

• Sortarea cu vehicularea cheii  şi indexului, presupune memorarea într-un vector numai avalorii 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, rezultând î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, preluând articolele din fişierul iniţial, în acces direct. Cheile desortare şi indexurile pot fi memorate în vectori distincţi sau într-unul singur, cu elemente de tip articol.

Exemplu: program sortare_2;type

art=recordgrupa:byte;nume_student:string[30];medie:real;

end;

art_cheie=recordmedie:real;index:byte

end;var 

f,g:file of art; y:art; aux:art_cheie;x:array[1..250] of art_cheie;i,j,n:byte;

 beginassign(f,'student.dat'); reset(f);assign(g,'students.dat'); rewrite(g);

n:=filesize(f):(* ---------------------------------- *)for i:=1 to n do

beginread(f,y);x[i].medie:=y.medie;x[i].index:=i-1;

end;(*-------------------------------------*)for i:=1 to n-1 do

for j:=i+1 to n doif x[i].medie <x[j].medie thenbegin

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

end;(*--------------------------------------*)for i:=1 to n do

beginseek(f,x[i].index);

read(f,y);write(g,y)end;

Page 3: Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

8/8/2019 Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

http://slidepdf.com/reader/full/sortarea-si-interclasarea-fisierelor-binare-memorate-dens 3/6

 Algoritmi  şi programe de prelucrare a fi  şierelor 

close(f); close(g)end.

• Sortarea numai cu vehicularea indexului este o metodă mai bună decât precedenta, deoarecemicşorează timpul de execuţie, prin eliminarea interschimbării valorilor cheii de sortare (mai ales cândaceasta 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 seefectuează numai pentru indexuri. Se va crea un alt fişier fizic.

Exemplu: program sortare_3;type

art=recordgrupa:byte;nume_student:string[30];medie:real;

end;

var f,g:file of art;x:array[1..250] of real;index:array[1..250] of byte;i,j,n,aux:byte;y:art;

 beginassign(f,'student.dat'); reset(f);assign(g,'students.dat'); rewrite(g);n:=filesize(f);

(*------------------------------------------ *)for i:=1 to n do

 beginread(f,y);x[i]:=y.medie;index[i]:=i-1

end;(* ------------------------------------------ *)for i:=1 to n-1 do

for j:=i+1 to n doif x[index[i]] < x[index[j]] then

begin aux:=index[i];index[i]:=index[j];index[j]:=aux

end;(* ------------------------------------------- *)for i:=1 to n do

 beginseek(f,index[i]);read(f,y);write(g,y)

end;close(f); close(g)end.

Page 4: Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

8/8/2019 Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

http://slidepdf.com/reader/full/sortarea-si-interclasarea-fisierelor-binare-memorate-dens 4/6

 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) şiscrierea î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 decât la metodele de sortare în memorie, deoareceoperaţ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 repetitivevor fi utilizaţi pentru controlul numărului relativ al articolelor în fişier.

Exemplu:a) Sortarea prin interschimbare

……………………………………………repeat

vb:=false;for i:=1 to filesize(f)-1 dobeginseek(f,i-1); read(f,x,y);

if x.medie < y.medie thenbegin

seek(f,i-1);write(y,x);vb:=true

endend

until not vb;………………………………………………..

b) Sortare prin selecţie

…………………………………………………for i:=1 to filesize(f)-1 do

beginseek(f,i-1); read(f,x);for j:=i+1 to filesize(f) do

beginseek(f,j-1); read(f,y);if x.medie < y.medie then

begin

seek(f,i-1); write(f,y);seek(f,j-1); write (f,x);x:=y

endend

end………………………………………………..

 Interclasarea este operaţia prin care, din două sau mai multe mulţimi ordonate, se obţine onouă mulţime, ordonată după acelaşi criteriu. Interclasarea fişierelor apare ca necesitate în aplicaţiileeconomice, mai ales în faza de post-populare a fişierelor mari de date, create simultan pe submulţimi

de mai mulţi utilizatori şi necesitând, î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şicâmp, pe baza căruia se va realiza, prin compar ări succesive, operaţia de interclasare. Câmpul poartă

Page 5: Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

8/8/2019 Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

http://slidepdf.com/reader/full/sortarea-si-interclasarea-fisierelor-binare-memorate-dens 5/6

 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).

1 2 3 4 n

Fişiereiniţ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 sfâr ş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 câmpul apar ţinând articolului curent. Dacă fişierul a fost parcurs integral, cheia de interclasare coprespunzătoare lui va primi o valoare din afara mulţimii pecare este definit acel câmp. Valoarea este denumită în practică high-value (HV), şi este definită de

  programator. Procesul se încheie când ambele chei de interclasare au valoarea HV. Dimensiuneafiş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 câmpul c apar ţinând 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 1,nume_fisier_intrare_ 1);reset(f 1);assign(f2,nume_fisier_intrare_2);reset(f2);assign(f3,nume_fisier_iesire);

rewrite(f3);read(f 1,art_ 1);k 1:=art_ 1.c;

Page 6: Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

8/8/2019 Sortarea Si Interclasarea Fisierelor Binare Memorate Dens

http://slidepdf.com/reader/full/sortarea-si-interclasarea-fisierelor-binare-memorate-dens 6/6

 Algoritmi  şi programe de prelucrare a fi  şierelor 

read(f2,art_2);k2:=art_2.c;while (k 1 <> hv) or (k2 <> hv) do

if k 1 < k2 thenbegin

write(f3,art_ 1);

if eof(f 1) then k 1:=hv else read(f 1,art_ 1)endelse

beginwrite(f3,art_2);if eof(f2) then k2:=hv else read(f2,art_2)

end;close(f 1);close(f2);close(f3)

end.