1 / 18

Sortari interne - caracteristici generale

Sortari interne - caracteristici generale. in aceleasi locatii (nr. minim de locatii suplimentare) operatia de baza - compararea cheilor. Sortari interne - algoritmii. S. prin insertie directa S. prin selectie directa (a min. sau max.) S. prin interschimbare directa (BubbleSort).

hedya
Download Presentation

Sortari interne - caracteristici generale

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Sortari interne - caracteristici generale • in aceleasi locatii (nr. minim de locatii suplimentare) • operatia de baza - compararea cheilor

  2. Sortari interne - algoritmii • S. prin insertie directa • S. prin selectie directa (a min. sau max.) • S. prin interschimbare directa (BubbleSort)

  3. Sortari interne - algoritmii • S. prin insertie directa • sortarea prin insertie cu micsorarea incrementului (ShellSort) • S. prin selectie directa (a min. sau max.) • sortarea prin selectie folosind structuri arborescente (ansamble=heap)(HeapSort) • S. prin interschimbare directa (BubbleSort) • sortarea prin interschimbare folosind partitii (QuickSort)

  4. Sortarea prin insertie directa • pas iterativ (1): se ia componenta A[2] şi se inserează la locul ei în vectorul sortat de lungime 1, A[1], producând un vector sortat de lungime 2. • pas iterativ (i): (pasă) vectorul este împărţit în două părţi: A[1], …, A[i] este sortată crescător şi se numeşte destinaţie, iar A[i+1], …, A[n] este încă nesortată şi se va numi sursă. Se ia prima componentă din sursă, A[i+1], şi se caută să se insereze la locul ei în destinaţie. Căutarea locului lui A[i+1] în destinaţie se face linear, parcurgând destinaţia de la dreapta la stânga şi mutând pe rând câte o poziţie la dreapta componentele care sunt mai mari decât valoarea de inserat, până când găsim locul valorii x =A[i+1] şi o inserăm.

  5. Sortarea prin insertie directa procedure InsDir (A) {sortare prin insertie directa a vectorului A[1..n]} for i:= 2 to n do x:= A[i]; {se caută locul valorii x în destinaţie} j:= i- 1; while (j > 0) and (x < A[j]) do A[j+1]:= A[j] j:= j- 1 endwhile {inserarea lui x la locul lui} A[j+1]:= x endfor endproc.

  6. Sortarea prin insertie directa (cont.) procedure InsDir1(A) {s. prin insertie directa a vectorului A[1..n] cu componenta marcaj A[0]} for i:= 2 to n do {se introduce valoarea în componenta marcaj} A[0]:= A[i]; {se caută locul valorii în destinaţie} j:= i-1; while (A[0] < A[j]) do A[j+1]:= A[j] j:= j-1 endwhile A[j+1]:= A[0] endfor endproc.

  7. Sortarea prin insertie directa - complexitate La fiecare pas iterativ i (cu i=1,…,n-1) al algoritmului, când se inserează componenta A[i+1] la locul ei în destinaţie - notăm cu Ci numărul de comparaţii efectuat (presupunem că lucrăm pe variante cu componentă marcaj, deci avem câte o singură comparaţie ce controlează ciclul while care caută locul inserării efectuând şi mutări). Ci poate atinge o valoare maximă, i+1, dacă valoarea de inserat este cea mai mică şi va veni pe prima componentă a sursei; poate atinge o valoare minimă, şi anume 1, dacă valoarea de inserat este cea mai mare şi poziţia ei va fi ultima din noua sursă, iar valoarea medie a lui Ci va fi i/2. - notăm cu Mi numărul de mutări efectuat de algoritm la pasul iterativ i, avem relaţia Mi=Ci+1 între mutări şi comparaţii

  8. Sortarea prin insertie directa - complexitate Cmin= 1 + 1 + … + 1 = n-1 pas 1 pas 2 pas n-1 Mmin= 2 + 2 + … + 2 = 2(n-1) pas 1 pas 2 pas n-1

  9. Sortarea prin selecţie directa a minimului • pas iterativ (i): (pasă) vectorul este împărţit în două părţi: • destinaţiaA[1..i-1] ce conţine minime puse la locul lor de paşii anteriori, şi • sursaA[i..n], pe care se efectuează o pasă, adică se caută secvenţial minimul din subvectorul sursă şi apoi se interschimbă cu componenta A[i]. • dimensiunea destinaţiei creşte cu 1, iar a sursei scade corespunzător. După n-1 paşi iterativi vectorul A va fi sortat crescător.

  10. Sortarea prin selecţie directa a minimului • procedure SelDir(A) • for i:= 1 to n-1 do • {căutarea secvenţială a minimului în A[i..n] } • k:= i; min:= A[i]; {iniţializarea minimului} • for j:= i+1 to n do • if A[j] <min then {se schimbă minimul local} • k:= j; min:= A[j] • endif • endfor • {schimbarea minimului cu A[i] } • A[k]:= A[i] • A[i]:= min • endfor • endproc

  11. Sortarea prin selecţie directa - complexitate numărul de comparaţii este independent de ordinea iniţială a componentelor

  12. Sortarea prin interschimbare directa • (pasă) parcurgem vectorul de la dreapta la stânga comparând două elemente succesive A[i-1] şi A[i]; dacă A[i-1] A[i] le lăsăm pe loc, dacă A[i-1] > A[i] le interschimbăm. • pas iterativ (i): vectorul este împărţit în două părţi: • destinaţiaA[1..i-1] cela mai mici i-1 valori puse la locul lor de paşii anteriori • sursaA[i..n], pe care se efectuează o pasă, de la dreapta spre stânga, rezultat impingerea minimului din sursa pe A[i]. • dimensiunea destinaţiei creşte cu 1, iar a sursei scade corespunzător. După n-1 paşi iterativi vectorul A va fi sortat crescător.

  13. Sortarea prin interschimbare directa procedure InterschDir(A) for j:=2 to n do for i:=n downto j do if A[i-1] > A[i] then interschimbă (A[i-1], A[i]) endif endfor endfor endproc.

  14. Sortarea prin interschimbare directa-modificari - posibilitatea reducerii numărului de paşi iterativi dacă la o pasă nu se face nici o interschimbare, atunci sursa este sortată şi, cum şi destinaţia este, înseamnă că întregul vector A este sortat şi este inutil să mai reluăm pasele - scurtarea lungimii paselor să ţinem minte, nu numai faptul că s-au făcut efectiv interschimbări, dar şi locul unde s-a efectuat ultima interschimbare. Din acest loc, până la destinaţie, avem de-a face cu o bucată sortată, deci e suficient să reluăm pasa următoare de la n şi până aici. Dacă ultima interschimbare s-a făcut între A[k-1] şi A[k], atunci sursa pentru pasul următor va fi A[k+1..n]. Se schimbă deci şi lungimea surselor

  15. Sortarea prin interschimbare directa-complexitate numărul de comparaţii pe care-l face algoritmul la fiecare pas iterativ i este determinat de lungimea subvectorului sursă A[i..n] pe care se face o pasă şi este independent de ordinea cheilor. La pasul i algoritmul face Ci = n-1 comparaţii

  16. Sortare Shell - s. prin insertie cu micsorarea incrementului În 1959 D.L. Shell a propus un algoritm de sortare bazat pe metoda prin inserţie directă, algoritm cu o performanţă îmbunătăţită deoarece face comparaţii între chei mai distanţate din vector. Algoritmul sortează mai întâi prin inserţie subvectori obţinuţi din vectorul iniţial prin extragerea componentelor aflate la o distanţă h una de cealaltă, distanţă care se numeşte increment. Repetând procedeul pentru incremenţi din ce în ce mai mici şi, în final, pentru incrementul 1, se obţine vectorul sortat.

  17. Sortare Shell - s. prin insertie cu micsorarea incrementului • se consideră un şir descrescător de numere naturale, numite incremenţi dintre care ultimul, ht, este 1: • h1 > h2 > … > hi > hi+1 > … > ht = 1. • (1) Se porneşte cu incrementul h1. • (2) La pasul iterativ m se consideră incrementul hm . Se sortează prin inserţie directă subvectorii obţinuţi din vectorul iniţal luând elemente aflate la distanţa hm, adică subvectorii: • A[1], A[hm+1], A[2hm+1], … • A[2], A[hm+2], … • A[hm], A[2hm], … • Apoi se reia pasul (2) pentru incrementul hm+1. • Deoarece ultimul increment este ht=1, ultimul pas iterativ t se reduce la sortarea prin inserţie directă, deci vectorul va fi sortat.

  18. Sortare Shell - s. prin insertie cu micsorarea incrementului • D. E. Knuth recomandă incremenţi obţinuţi cu următoarele formule recursive: • şi , , avem 1, 4, 13, 40,… • şi , , avem 1, 3, 15, 31,… • Există o estimare a complexităţii acestui algoritm care-l plasează în clasa O(n1,3) ,din punct de vedere al numărului de comparaţii. Din punct de vedere al spaţiului, am văzut că el necesită h(1) locaţii suplimentare pentru componentele marcaj, cu ajutorul cărora eliminăm testele de nedepăşire a dimensiunii, teste care ar dubla numărul de comparaţii.

More Related