Documente Academic
Documente Profesional
Documente Cultură
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
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}
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