Algoritm de sortare Shell cu exemplu
โก Rezumat inteligent
Sortarea prin shell este un algoritm de comparare in-place care generalizeazฤ sortarea prin inserศie prin compararea elementelor aflate la mare distanศฤ, apoi micศorรขnd spaศiul pรขnฤ cรขnd elementele adiacente sunt sortate.

Ce este sortarea Shell?
Sortarea prin shell, numitฤ ศi metoda Shell, este un algoritm eficient de sortare bazat pe comparaศii in-place. Numit dupฤ Donald Shell, care a introdus ideea รฎn 1959, este o extensie generalizatฤ a sortฤrii prin inserศie care depฤศeศte comportamentul sฤu pฤtratic pe date รฎmprฤศtiate.
Ideea fundamentalฤ este de a grupa elementele care sunt depฤrtate, de a sorta fiecare grup folosind sortarea prin inserศie ศi de a micศora spaศiul pas cu pas pรขnฤ ajunge la unu. Pรขnฤ atunci, matricea este aproape sortatฤ.
Acest interval, respectiv intervalul, urmeazฤ o secvenศฤ aleasฤ, cum ar fi originalul lui Shell, al lui Knuth, al lui Hibbard sau al lui Sedgewick. Originalul lui Shell este n/2, n/4, ..., 1.
Algoritmul de sortare Shell
Pas 1) Iniศializaศi valoarea intervalului h = n/2, unde n este dimensiunea matricei.
Pas 2) Plasaศi toate elementele aflate la o distanศฤ de intervalul h รฎntr-o sublistฤ.
Pas 3) Sortaศi fiecare sublistฤ folosind sortarea prin inserศie.
Pas 4) Setaศi un nou interval h = h/2.
Pas 5) Dacฤ h > 0, reveniศi la Pasul 2. รn caz contrar, treceศi la Pasul 6.
Pas 6) Matricea rezultatฤ este acum complet sortatฤ.
Cum funcศioneazฤ sortarea Shell
รn sortarea prin inserศie, elementele se miศcฤ doar cu o poziศie la un moment dat. Sortarea prin shell รฎmparte รฎn schimb matricea รฎn subliste distanศate larg pe baza intervalului ศi ruleazฤ sortarea prin inserศie pe fiecare sublistฤ.
Pe mฤsurฤ ce intervalul se micศoreazฤ, dimensiunea sublistei creศte. Deoarece trecerile anterioare lasฤ datele parศial sortate, intervalele mai mici necesitฤ mult mai puศine schimbฤri decรขt rularea sortare inserศie de la zero. Figura de mai jos ilustreazฤ o pasฤ de sortare Shell.
Funcศionarea algoritmului de sortare Shell cu exemplu
Sฤ sortฤm matricea de mai jos folosind sortarea Shell.
Pas 1) Dimensiunea matricei este 8, deci valoarea intervalului iniศial este h = 8/2 = 4.
Pas 2) Grupeazฤ elementele la patru poziศii distanศฤ. Subliste: {8, 1}, {6, 4}, {7, 5}, {2, 3}.
Pas 3) Sorteazฤ fiecare sublistฤ folosind sortarea prin inserศie. O variabilฤ temporarฤ reศine valoarea plasatฤ รฎn timp ce elementele se deplaseazฤ. Dupฤ schimbฤri, matricea aratฤ astfel.
Pas 4) Micศoreazฤ intervalul. Noul interval este h = 4/2 = 2.
Pas 5) Deoarece 2 > 0, reveniศi la Pasul 2 ศi grupaศi elementele la douฤ poziศii distanศฤ: {1, 5, 8, 7} ศi {4, 2, 6, 3}.
Sorteazฤ prima sublistฤ. Tabloul devine:
Dupฤ sortarea celei de-a doua subliste:
Micศoraศi din nou intervalul la h = 2/2 = 1. Cu un interval de unu, Shell Sort executฤ o pasฤ finalฤ de sortare prin inserศie asupra รฎntregului array, aศa cum se aratฤ mai jos.
Pas 6) รmpฤrศirea din nou a intervalului dฤ 0. Tabloul este acum complet sortat:
Pseudo-Code pentru sortare Shell
Start Input array a of size n for (interval = n / 2; interval > 0; interval /= 2) for (i = interval; i < n; i += 1) temp = a[i]; for (j = i; j >= interval && a[j - interval] > temp; j -= interval) a[j] = a[j - interval]; a[j] = temp; End
Program de sortare Shell รฎn C/C++
Intrare:
//Shell Sort Program in C/C++ #include <bits/stdc++.h> using namespace std; void ShellSort(int data[], int size) { for (int interval = size / 2; interval > 0; interval /= 2) { for (int i = interval; i < size; i += 1) { int temp = data[i]; int j; for (j = i; j >= interval && data[j - interval] > temp; j -= interval) { data[j] = data[j - interval]; } data[j] = temp; } } } int main() { int data[] = {8, 6, 7, 2, 1, 4, 5, 3}; int size = sizeof(data) / sizeof(data[0]); ShellSort(data, size); cout << "Sorted Output: \n"; for (int i = 0; i < size; i++) cout << data[i] << " "; cout << "\n"; }
ieศire:
Sorted Output:
1 2 3 4 5 6 7 8
Exemplu de sortare Shell รฎn Python
Intrare:
#Shell Sort Example in Python def ShellSort(data, size): interval = size // 2 while interval > 0: for i in range(interval, size): temp = data[i] j = i while j >= interval and data[j - interval] > temp: data[j] = data[j - interval] j -= interval data[j] = temp interval //= 2 data = [8, 6, 7, 2, 1, 4, 5, 3] ShellSort(data, len(data)) print('Sorted Output:') print(data)
ieศire:
Sorted Output:
[1, 2, 3, 4, 5, 6, 7, 8]
Aplicaศii ale sortฤrii Shell
Sortarea Shell apare รฎncฤ รฎn sistemele moderne unde spaศiul stivei sau simplitatea conteazฤ.
- Linux kernel foloseศte sortarea Shell รฎn locurile รฎn care evitarea unei stive de apeluri este importantฤ.
- Biblioteca C รฎncorporatฤ uClibc foloseศte sortarea Shell pentru a menศine utilizarea memoriei la un nivel scฤzut.
- bzip2 foloseศte sortarea prin Shell pentru a evita recursivitatea profundฤ รฎn timpul sortฤrii pe blocuri.
- Firmware-ul รฎncorporat favorizeazฤ sortarea Shell pentru seturi de date mici unde recursivitatea este restricศionatฤ.
Avantajele ศi dezavantajele sortฤrii Shell
| Avantaje | Dezavantaje |
|---|---|
| Nu este necesarฤ o stivฤ de apeluri, ceea ce este ideal pentru sistemele integrate. | Nu este cea mai rapidฤ opศiune pentru matrice foarte mari. |
| Uศor de implementat cu o cantitate micฤ de cod. | Performanศa se degradeazฤ pe date cu elemente rฤspรขndite pe scarฤ largฤ. |
| Eficient pentru tablouri de dimensiuni moderate sau parศial sortate. | Complexitatea temporalฤ รฎn cel mai rฤu caz este sensibilฤ la secvenศa de gap-uri aleasฤ. |
| Funcศioneazฤ in situ, deci foloseศte memorie auxiliarฤ constantฤ. | Nu este o sortare stabilฤ, deci cheile egale รฎศi pot schimba ordinea relativฤ. |
Analiza complexitฤศii sortฤrii Shell
Complexitatea timpului a sortฤrii Shell
Complexitatea temporalฤ a sortฤrii Shell depinde de secvenศa de gap-uri utilizatฤ.
รn cel mai bun caz, cรขnd matricea este deja aproape aranjatฤ, fiecare trecere necesitฤ doar un numฤr logaritmic de teste, rezultรขnd O(n log n).
รn cel mai rฤu caz, matricea este aranjatฤ astfel รฎncรขt elementele sฤ necesite comparaศii maxime, iar incrementul final dominฤ la O(n^2) cu secvenศa originalฤ a Shell.
- Complexitatea รฎn cel mai bun caz: O(n log n)
- Complexitatea medie a cazurilor: O(n log n) pรขnฤ la O(n^(4/3)) รฎn funcศie de secvenศa de gap-uri
- Complexitatea รฎn cel mai rฤu caz: O(n^2) cu secvenศa originalฤ a lui Shell
Cea mai bunฤ secvenศฤ de gap-uri de uz general este รฎncฤ o รฎntrebare de cercetare deschisฤ, deศi secvenศele Sedgewick ศi Ciura performeazฤ bine รฎn practicฤ.
Complexitatea spaศiului de sortare a carcasei
Sortarea รฎn shell nu necesitฤ tablouri auxiliare, deci complexitatea spaศiului este O(1) indiferent de dimensiunea intrฤrii, acesta fiind unul dintre cele mai puternice avantaje practice ale sale.










