Lucrarea nr. 4 SORTAREA FISIERELOR SECVENTIALE 1. Scopul lucrarii: prezentarea unor metode de sortare specifice structurilor de tip fisier, structuri caracterizate prin faptul ca la un moment dat este accesibila o singura compo- nenta a lor. In lucrare se vor prezenta patru metode de sortare bazate pe interclasare. 2. Aspecte teoretic Interclasarea presupune combinarea a doua sau mai multe secvente ordonate intr-o singura secventa, prin selectia repetata a componentelor curent accesibile. Procesul de sortare implica executia repetata a unui grup de operatii, fiecare operatie tratind intregul set de date. O aseme- nea operatie se numeste faza, iar grupul de operatii care se repeta se numeste trecere. In cele ce urmeaza vor fi utilizate urmatoarele notatii: TYPE TipElement=RECORD cheie:Integer; {alte cimpuri} end; Banda=FILE OF TipElement; 2.a. Interclasarea cu trei benzi Principiu: fie "a" secventa care trebuie sortata. (1) Se imparte a in 2 jumatati: b si c. (2) Se interclaseaza b cu c, combinind cite un element din fiecare, rezultind perechi ordonate care vor forma o noua secventa a. (3) Pentru noua secventa a se repeta pasii (1) si (2), combinind insa perechile ordonate in quadruple ordonate. (4) Se repeta pasii (1) si (2), interclasind quadru- plele in 8-uple s.a.m.d., dublind de fiecare data lungimea sub- secventelor de interclasare, pina la sortarea intregii secvente. Pentru implementarea acestei metode sint necesare trei benzi magnetice (respectiv trei fisiere pe disc) corespunzatoare sec- ventelor a, b si c. In cadrul acestei metode o trecere se compune din doua faze: injumatatirea (1) si interclasarea (2). Injuma- tatirea se va efectua in asa fel incit un n-uplu ordonat al secventei a sa fie distribuit in intregime pe una din secventele b sau c (sa nu fie divizat intre cele 2 secvente destinatie). In acest scop este bine ca n-uplele ordonate sa fie depuse alterna- tiv in secventele b si c. Implementarea algoritmului in Pascal: procedure Interclasare_3_benzi; VAR a,b,c:Banda; p,k:Integer; procedure Injumatatire(n:Integer); VAR x:TipElement; procedure ScrieN_uplu(var d:Banda); VAR i:Integer; begin {ScrieN_uplu} i:=0; while (i ai sau i=1 iv) aj > aj+1 sau j=n Definitia include si monotoniile cu un singur element, cind i=j. Sortarea naturala se realizeaza prin interclasarea monotoniilor, avind la baza proprietatea ca daca se interclaseaza doua secvente a cite m monotonii, se obtine o secventa cu exact m monotonii. Algoritmul utilizeaza trei fisiere: a,b - auxiliare si c - fisierul de sortat. Fiecare trecere este constituita din doua faze alternative: -defalcarea: delimitarea monotoniilor din cadrul fisierului c si distribuirea acestora pe fisierele a si b; -interclasarea: monotoniile de pe a si b se combina, formind o noua secventa c. In faza de defalcare monotoniile gasite sint depuse alternativ in fisierele a si b, astfel incit fie cele doua fisiere vor contine cite un numar egal de monotonii, fie pe a va fi o monotonie in plus fata de b. Dupa interclasarea monotoniilor perechi, monotonia nepereche va fi recopiata in c. Implementarea algoritmului in Pascal: procedure InterclasareNaturala; VAR l:Integer; a,b,c:Banda; terma,termb,termc,sm:Boolean; arta,artb,artc:TipElement; procedure Copiaza(var x,y:Banda;var artx:TipElement; var termx:boolean); var aux:TipElement; begin write(y,artx); if Eof(x) then begin sm:=True;termx:=true end else begin aux:=artx;read(x,artx); sm:=aux.cheie > artx.cheie end; {Copiaza} procedure CopiazaMonotonia(var x,y:Banda ;var artx:TipElement;var termx:boolean); {x - fisierul in care se delimiteaza monotonia y - fisierul in care se copiaza monotonia} begin repeat Copiaza(x,y,artx,termx) until sm end; {CopiazaMonotonia} procedure Defalcare; begin Rewrite(a);Rewrite(b);Reset(c); termc:=Eof(c); Read(c,artc); repeat CopiazaMonotonia(c,a,artc,termc); if not termc then CopiazaMonotonia(c,b,artc,termc) until termc; Close(a);Close(b);Close(c) end; {Defalcare} procedure InterclasareMonotonie; begin repeat if arta.cheie < artb.cheie then begin Copiaza(a,c,arta,terma); if sm then CopiazaMonotonia(b,c,artb,termb) end else begin Copiaza(b,c,artb,termb); if sm then CopiazaMonotonia(a,c,arta,terma) end until sm end; {InterclasareMonotonie} procedure Interclasare; begin Reset(a); Reset(b); Rewrite(c); terma:=Eof(a); termb:=Eof(b); if not terma then Read(a,arta); if not termb then Read(b,artb); while not termb do begin InterclasareMonotonie; l:=l+1 end; if not terma then begin CopiazaMonotonia(a,c,arta,terma); l:=l+1 end; Close(a);Close(b);Close(c) end; {Interclasare} begin {InterclasareNaturala} repeat Defalcare; l:=0; Interclasare; until l=1; end; {InterclasareNaturala} 2.d. Interclasarea multipla echilibrata Principiu: constituie o imbunatatire a interclasarii natu- rale in sensul reducerii numarului de treceri prin distribuirea monotoniilor pe mai mult decit doua fisiere. Astfel, daca se interclaseaza r monotonii si se distribuie pe N benzi, pe fiecare banda se vor obtine r/N monotonii, la urmatoarea interclasare- distribuire vor rezulta r/N**2 monotonii, apoi r/N**3s.a.m.d. Deci numarul de treceri in acest caz va fi log N (n) (n=lungimea fisierului de sortat). Interclasarea multipla se poate realiza intr-o singura faza, fapt care presupune ca la fiecare trecere se utilizeaza un numar egal de fisiere de intrare si de iesire, monotoniile de pe primele fiind interclasate si imediat redistribuite pe celelalte. In continuare presupunem ca in total se folosesc N fisiere, N - par, iar interclasarea se va realiza pe N/2 cai. In program va fi necesara o structura de date de tip tablou de fisiere. Fata de interclasarea naturala (care poate fi privita ca o interclasare multipla cu doua cai) aici apar citeva actiuni suplimentare care trebuie executate: -gestionarea unei liste de fisiere active, din care se elimina pe rind fisierele ce ramin vide; -comutarea grupelor de fisiere de intrare si iesire dupa fiecare trecere. Structurile de date folosite se definesc astfel: TYPE NrBanda=1..N; {nr. total de fisiere; N-par} VAR f:ARRAY[NrBanda] OF Banda; {cele N fisiere} f0:Banda; {fisierul initial care trebuie sortat} t:ARRAY[NrBanda] OF NrBanda; {tabela cu indicii benzilor} Tabela t este necesara in vederea comutarii fisierelor de intrare si iesire; astfel: daca notam Nh=N/2, elementele t[1],...,t[Nh] contin indicii benzilor de intrare, iar t[Nh+1],...,t[N] - indicii benzilor de iesire. Initial t[i]=i, i=1,N si dupa fiecare trecere se va realiza interschimbarea t[j] - t[Nh+j] , j=1,Nh Se mentioneaza ca fisierele nu vor fi accesate direct, ci prin intermediul tabelei t, adica in loc de f[i] se va utiliza f[t[i]]. Pe masura ce avanseaza procesul de sortare, se reduce numarul monotoniilor si ca atare si numarul fisierelor active. Se considera ca sortarea s-a incheiat cind mai ramine un singur fisier activ. In program se va folosi o variabila k1 care va indica numarul actual de fisiere de intrare active. Descrierea formala a algoritmului: procedure InterclasareMultipla; VAR i,j,tx:NrBanda; l:Integer; {nr. monotonii distribuite} begin {distribuire monotonii initiale pe t[1]...t[Nh]} j:=Nh; l:=0; repeat if j