Sortarea prin inserție (Insertion Sort) în C++
Sortarea prin inserție (Insertion Sort) este o metodă de sortare a vectorilor în complexitate oarecum asemănătoare cu sortarea prin selecție. Vom considera că dorim să sortăm crescător vectorul de lungime indexat de la
Algoritm
Sortarea prin inserție presupune că, la fiecare pas primele elemente din vector sunt deja sortate. Urmează să extindem această secvență de elemente sortate folosind elementul curent, Pentru a vedea pe ce poziție trebuie să-l inserăm pe pur și simplu parcurgem elementele de la stânga lui căutând unul mai mic sau egal cu Dacă notăm poziția la care am găsit acest element cu (în caz că nu există un astfel de element, considerăm atunci va fi inserat pe poziția Putem fie să apropiem treptat elementul de poziția căutată, interschimbând la fiecare pas elementele și ca mai jos…
for (int i = 2; i <= n; i++) for (int j = i; j > 1 && v[j - 1] > v[j]; j--) { int aux = v[j]; v[j] = v[j - 1]; v[j - 1] = aux; }
Fie să mutăm elementele mai mari decât cu o poziție la dreapta, în timp ce le parcurgem, urmând ca la final să-l copiem pe pe poziția Pentru asta vom avea nevoie de o variabilă auxiliară unde să-l copiem la început pe Varianta aceasta este mai eficientă, efectuând de ori mai puține atribuiri.
for (int i = 2; i <= n; i++) { int j, aux = v[i]; for (j = i; j > 1 && v[j - 1] > aux; j--) v[j] = v[j - 1]; v[j] = aux;}
Exemplu
Iată mai jos o vizualizare a algoritmului. Am colorat cu roșu elementul cu galben cu verde elementele sortate și cu alb pe celelalte.
Complexitate
Primul for
efectuează iterații, iar al doilea, în cel mai rău caz, tot Prin urmare, complexitatea în timp a sortării prin inserție este Cel mai rău caz este atins atunci când vectorul dat este sortat invers (descrescător). Cel mai bun caz, în care algoritmul rulează în este cel în care vectorul e deja sortat.
Având în vedere că elementele de la stânga lui sunt sortate, putem căuta binar poziția la care trebuie să-l inserăm pe Astfel, am reduce numărul de comparații de la fiecare pas de la la Totuși, optimizarea asta nu schimbă complexitatea finală, pentru că oricum mutarea elementelor la dreapta consumă operații.
Dacă aveți vreo întrebare legată de sortarea prin inserție în C++, nu ezitați să o lăsați mai jos, într-un comentariu