Page 30 - MATINF Nr. 7
P. 30

30                                                                                     C. B˘alc˘au



                     – se compar˘a apoi din nou x = a u cu elementele neanalizate din stˆanga (marginea
                       opus˘a) a p+1 , a p+2 , . . . , iar cˆand se ajunge la un nou element a p cu a p > a u atunci din
                       nou se interschimb˘a x = a u cu noul a p ;
                     – se continu˘a acest procedeu cˆat timp subsecvent , a (a p , . . . , a u ) format˘a din x, care este
                       a p sau a u , s , i elemente r˘amase neanalizate verific˘a inegalitatea p < u, adic˘a are cel
                       put , in dou˘a elemente;
                     – la final se ajunge ca p = u s , i astfel x = a p = a u , deci k = p = u este pozit , ia pivotului
                       x s , i procedeul de partit , ionare (determinarea pozit , iei pivotului s , i astfel a celor dou˘a
                       partit , ii ˆın care acesta ˆımparte vectorul) este ˆıncheiat.

                • Se sorteaz˘a cresc˘ator cele dou˘a partit , ii (a 1 , . . . , a k−1 ) s , i (a k+1 , . . . , a n ), prin acelas , i procedeu,
                  dac˘a au cel put , in dou˘a elemente. Partit , iile vide s , i cele care au un singur element sunt,
                  bineˆınt , eles, deja sortate.

            Observat ,ia 1. Spre deosebire de algoritmul mergesort, unde ˆımp˘art , irea vectorului ˆın doi sub-
            vectori (etapa ,,Divide” din strategia Divide et Impera) se realiza instantaneu prin intermediul
            elementului median, la sortarea rapid˘a aceast˘a etap˘a necesit˘a rearanjarea elementelor pentru
            a obt , ine pivotul a k s , i cele dou˘a partit , ii. Pe de alt˘a parte, dup˘a sortarea independent˘a a celor
            dou˘a partit , ii vectorul A va fi acum sortat, spre deosebire de algoritmul mergesort, unde dup˘a
            sortarea celor doi subvectori urma interclasarea lor (etapa ,,Combin˘a” din strategia Divide et
            Impera, care astfel nu mai este necesar˘a la algoritmul quicksort).


                Descrierea ˆın pseudocod a algoritmului are urm˘atoarea form˘a.
                QUICKSORT(A, p, u) :                                // sortarea secvent , ei (a p , . . . , a u )
                if p < u then
                   k ←PIVOT(A, p, u);                      // se determin˘ a, rearanjˆ and elementele,
                                                                             // pozit , ia k a pivotului
                   QUICKSORT(A, p, k − 1);                        // sortarea partit , iei (a p , . . . , a k−1 )
                   QUICKSORT(A, k + 1, u);                        // sortarea partit , iei (a k+1 , . . . , a u )



                unde procedura de partit , ionare este:
                PIVOT(A, p, u) :
                d ← 0;                            // d = pasul de deplasare spre dreapta a lui p
                                               // 1 − d = pasul de deplasare spre stˆ anga a lui u
                             // d = 0 corespunde deplas˘ arii lui u (marginea din dreapta), iar
                                    // d = 1 corespunde deplas˘ arii lui p (marginea din stˆ anga)
                while p < u do
                   if A[p] > A[u] then
                       A[p] ↔ A[u];                                                   // interschimbare
                       d ← 1 − d;                  // se comut˘ a marginea unde se face deplasarea
                   p ← p + d; u ← u − 1 + d;                // deplasarea marginii corespunz˘ atoare

                                                         // s-a ajuns la p = u = pozit , ia pivotului
                return p;


                Apel:

                QUICKSORT(A, 1, n)          // pentru sortarea ˆ ıntregului vector A = (a 1 , . . . , a n ).
   25   26   27   28   29   30   31   32   33   34   35