SORTAREA PRIN INTERCLASARE - MERGE SORT

Acest algoritmul de sortare prin interclasare se bazează pe următoarea idee: pentru a sorta un vector cu n elemente îl împăţim în doi vectori care, odată sortaţi, se interclasează.

Conform strategiei Divide et Impera, problema este descompusă în alte două subprobleme de acelaşi tip şi, după rezolvarea lor, rezultatele se combină (în particular se interclasează). Descompunerea unui vector în alţi doi vectori care urmează a fi sortaţi are loc până când avem de sortat vectori de una sau două componente.

Exemplu Sortarea unui şir de şapte valori de tip întreg.



Algoritm descris în pseudocod:

Sort(p,q,A);

dacă A[p]>A[q] atunci

interschimba A[p]↔A[q]

sfSort

Interc(p,q,m,A)

i←p;j←m+1;k←0;

cât timp i<=m si j<=q execută

dacă A[i]<A[j] atunci

k←k+1;B[k] ←A[i];i←i+1

altfel

k←k+1;B[k] ←A[j];j←j+1;

sfdacă

sfcât timp

cât timp i<=m execută

k←k+1 B[k] ←A[i] i←i+1

sfcât timp

cât timp j<=q execută

k←k+1 B[k] ←A[j];j←j+1

sfcât timp

pentru i←p,q execută

A[i] ←B[i]

Sfpentru

Divimp(p,q,A)

dacă q-p<=1 atunci Sort(p,q,A)

altfel Divimp(p,m,A) Divimp(m+1,q,A)

Interc(p,q,m,A)

sfdacă

sfDivimp

Implementare în C++

void sort (int p,int q, int a[100] )

{ int m;

if (a[p]>a[q])

{m=a[p];a[p]=a[q];a[q]=m;}

}

void interc (int p,int q, int m, int a[100])

{

int b[100],i,j,k;

i=p; j=m+1; k=0;

while ((i<=m) && (j<=q))

if (a[i]<=a[j]) b[++k]=a[i++];

else b[++k]=a[j++];

while(i<=m)

b[++k]=a[i++];

while(j<=q)

b[++k]=a[j++];

for(i=p;i<=q;i++)

a[i]=b[i];

}

void divimp (int p, int q, int a[100])

{

int m;

if ((q-p)<=1) sort (p,q,a);

else

{ m=(p+q)/2;

divimp(p,m,a);

divimp(m+1,q,a);

interc(p,q,m,a);

}

}