Sunteți pe pagina 1din 5

6.3. Sortarea prin interclasare direct cu dou ci.

Interclasarea a dou iruri sortate.


Se dau dou iruri ordonate cresctor A[1..dimA] i B[1..dimB]. Ne punem
problema s construim irul C[1..dimA + dimB] ordonat cresctor ce conine toate
elementele lui A i B. Este un prim exemplu de operaie de combinare a dou structuri:
din dou structuri de acelai tip (n cazul acesta structuri liniare i ordonate) producem o
alta de acelai tip, care este "reuniunea" elementelor lor.
Algoritmul de interclasare are urmtoarea structur simpl:
Se parcurg simultan irurile A, B i C. La fiecare pas se compar cele dou componente
curente din A i B, iar cea mai mic dintre ele este mutat n C. Cnd s-a terminat una din
surse, A sau B, componentele rmase se adaug la C (ce poart denumirea de destinaie).
Procedura Merging ce-l implementeaz este dat n continuare:
procedure Merging(dimA, dimB, A, B, C)
iA := 1; iB := 1; iC := 1; {iniializarea indicilor pentru parcurgeri}
while (iA dimA) and (iB dimB) do
if A[iA] < B[iB] then
C[iC] := A[iA]
iA := iA + 1
else C[iC] := B[iB]
iB := iB + 1
endif
iC := iC + 1
endwhile
if iA > dimA then {s-a epuizat sursa A}
{mut n C componentele rmase n B}
for k := 0 to dimB - iB do C[iC + k] := B[iB + k]
else {s-a epuizat sursa B}
{mut n C componentele rmase n A}
for k := 0 to dimA - iA do C[iC + k]:=A[iA + k]
endif
endproc
Complexitatea algoritmului de interclasare: timp i spaiu.
Estimm complexitatea nti n funcie de numrul de comparaii. La fiecare
comparaie se mut n C o valoare, care nu va mai fi examinat ulterior de algoritm.
Pentru a completa toate cele dimA + dimB locaii ale destinaiei C, vom face deci cel mult
dimA + dimB - 1 comparaii (ultima component se mut n C fr a mai fi comparat).
n felul acesta, numrul maxim de comparaii pe care l face algoritmul de
interclasare este Cmax = dimA + dimB - 1. Este cazul cel mai nefavorabil, care se atinge

dac ultimele componente ale surselor trebuie s fie comparate ntre ele, deci dac
A[dimA] i B[dimB] vor fi cele mai mari elemente din C.
Exist i cazul cel mai favorabil, cu numr minim de comparaii Cmin = min(dimA,
dimB), caz care se atinge cnd vectorul surs de dimensiune mai mic are toate
componentele mai mici dect cele din a doua surs. Dac de exemplu dimB dimA i
B[dimB] A[1], atunci se fac doar dimB comparaii, (dimB = min(dimA, dimB)), iar toate
componentele din A se mut n C fr comparaii.
n ceea ce privete numrul de mutri, el este tot timpul constant i egal cu M =
dimA + dimB.
O caracteristic important a acestui algoritm, care-l plaseaz ntr-o clas distinct
fa de toi ceilali algoritmi discutai n acest capitol este faptul c are nevoie de spaiu n
plus, C[1..dimA + dimB], egal ca dimensiune cu spaiul necesar datelor de intrare. Cu alte
cuvinte, fa de ceilali algoritmi, spaiul utilizat este dublu.
Algoritmul se poate mbunti ca s foloseasc doar min(dimA, dimB) locaii n
plus. Presupunem dimA = n, dimB = m i nm. Alocm pentru A un numr de n + m
locaii, sursa din A ordonat cresctor de la A[n] la A[1], i punem rezultatul interclasrii
n captul liber al lui A (deoarece A are loc pentru cele m componente ale lui B). La
mutri de elemente din A, se mai elibereaz locaii. Destinaia este A, ordonat de la
A[n+m] la A[1].
A
n

B
m

Sortarea prin interclasare.


Putem folosi interclasarea pentru a sorta un vector. Algoritmul are urmtoarea
structur:
(1) Se pleac cu subvectori de lungime 1 ai lui A (care sunt sortai). Interclasnd cte doi
asemenea subvectori obinem A mprit n subvectori de lungime 2 ordonai cresctor.
(2) A este mprit n subvectori de lungime l ordonai cresctor. Se interclaseaz cte doi,
obinnd subvectori de lungime 2*l ordonai cresctor (aceast operaie se numete pas
i este implementat de procedura MergePass.). Se reia pasul (2) pn cnd avem un
singur subvector.
Algoritmul este implementat de procedura MergeSort prezentat n continuare. Ea
gestioneaz ca spaiu doi vectori A i B de aceeai lungime, dimA, n modul urmtor: la
pasul (1) A este surs iar B destinaie pentru interclasare. La pasul urmtor, B este surs i
A destinaie .a.m.d.
procedure Merge (dimA, dimB, dimC, sA, sB, sC, A, B, C)
{interclaseaz (exact ca i Merging) subvectorul A[sA, , sA + dimA - 1] cu subvectorul
B[sB,, sB + dimB - 1] i pune rezultatul pe subvectorul C[sC,,sC + dimA + dimB 1]}.

begin
iA : = sA - 1; {iniializarea indicelui curent al lui A}
iB : = sB - 1; {iniializarea indicelui curent al lui B}
iC : = sC - 1; {iniializarea indicelui curent al lui C}
while (iA < dimA + sA -1) and ( iB < dimB + sB - 1) do
begin
iC : = iC + 1;
if A[iA + 1] < B[iB + 1] then
begin
iA : = iA + 1;
C[iC] : = A[iA];
end
else
begin
iB : = iB + 1;
C[iC] : = B[iB]
end
end;
if iA > dimA + sA - 1 then {s-a terminat vectorul A}
{completm pe C cu B}
for k : = 1 to dimB + sB - iB - 1 do
C [iC + k] : = B[iB + k]
else {s-a terminat vectorul B}
{completm pe C cu A}
for k : =1 to dimA + sA - iA - 1 do
C[iC + k] : = A[iA + k]
end; {procedure Merge}
sA

dimA
sB

dimB
sC

dimA+dimB
procedure MergePass ( n, l, A, B);
{Se d vectorul A, de dimensiune n, mprit n subvectori de vectori de lungime l
(eventual cu excepia ultimului, care poate fi mai scurt) sortai. Fiecare pereche de
subvectori este ordonat prin interclasare folosind procedura Merge. Rezultatul se depune
n B.}

begin
q : = n / (l shl 1); {q = numrul perechilor de subvectori ntregi }
s : = ( l * q ) shl 1; {s = l * q * 2 = numrul de elemente n cele q perechi}
r : = n - s; {r = numrul de elemente rmase dup interclasarea celor q perechi}
{interclasarea celor q perechi de subvectori ntregi}
for i : = 1 to q do
begin
sA : = ((i - 1) * l) shl1 + 1; {indicele de la care ncepe al i-lea vector de
interclasat}
Merge (l, l, sA, sA + l, sA , A, A, B)
end;
{ce facem cu restul componentelor?}
if r <= l then {cazul n care mi-a rmas un singur subvector}
for i : =1 to r do
B[s + i] : = A [s + i]
else {cazul n care mi-au rmas 2 subvectori , ultimul incomplet}
Merge (l, r - l, s + 1, s + l + 1, s + 1, A, A, B )
end; {procedure MergePass}
procedure MergeSort (dimA, A);
begin
l : =1;
while l < dimA do
begin
MergePass(dimA, l, A, B);
MergePass(dimA, l * 2, B, A);
l:=l*4
end;
end; {procedure MergeSort}

Complexitatea sortrii prin interclasare.


Dac la sortarea unui vector cu n componente facem k pai iterativi pn ajungem
s-l sortm n ntregime, nseamn c ntre k i n avem relaia 2k-1 < n 2k , de unde
rezult k = [log2n]. Deoarece la un pas iterativ (care const din cte o pas pe subvectorii
surse) facem aproximativ n/2 comparaii, rezult c algoritmul intr n clasa de
complexitate O(n log2n). S nu uitm ns c el dubleaz dimensiunea spaiului de intrare.

Exerciii.
6.19 Este sortarea prin interclasare stabil ? Justificai rspunsul.
6.20 Este performana sortrii prin interclasare sensibil la gradul de ordonare iniial al
fiierului ?
6.21 S se scrie o funcie care ntoarce cheia maxim dintr-un tablou cu n chei, implementnd un
procedeu similar desfurrii unui turneu de tenis.
6.22 S se elaboreze varianta recursiv a sortrii prin interclasare.
6.23 S se ncerce o posibil optimizare a algoritmului de baz a metodei de sortare prin
interclasare prin utilizarea inseriei directe la sortarea subirurilor mici.
6.24 Fie dou secvene sortate care mpart acelai tablou i sunt poziionate astfel: prima crescnd
urmat de cealalt descrescnd, sau prima descrescnd urmat de cealalt crescnd (secven
bitonic). Se cere s se sorteze prin interclasare tabloul respectiv

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