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.

  • ๐Ÿ“Š Definiศ›ie: O generalizare in-place a sortฤƒrii prin inserศ›ie propusฤƒ de Donald Shell รฎn 1959 care foloseศ™te o secvenศ›ฤƒ de gap descrescฤƒtoare.
  • ๐Ÿ”€ Secvenศ›e de goluri: Secvenศ›ele originale ale lui Shell sunt n/2, n/4, โ€ฆ, 1; secvenศ›ele Knuth, Sedgewick ศ™i Ciura au performanศ›e mai bune รฎn practicฤƒ.
  • โšก Complexitate: O(n log n) รฎn cel mai bun caz, O(n^2) รฎn cel mai rฤƒu caz ศ™i O(1) รฎn spaศ›iul auxiliar.
  • โœ… Cazuri de utilizare: Nucleul Linux, uClibc ศ™i bzip2 folosesc sortarea Shell pentru a evita recursivitatea ศ™i memoria suplimentarฤƒ a stivei.
  • ๐Ÿค– Unghiul AI: Asistenศ›ii inteligenศ›i artificiali pot sugera secvenศ›e de goluri ศ™i pot genera vizualizฤƒri animate de tip Shell Sort la cerere.

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.

Shell Sort Funcศ›ioneazฤƒ

Funcศ›ionarea algoritmului de sortare Shell cu exemplu

Sฤƒ sortฤƒm matricea de mai jos folosind sortarea Shell.

Funcศ›ionarea algoritmului de sortare 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}.

Funcศ›ionarea algoritmului de sortare Shell

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.

Funcศ›ionarea algoritmului de sortare Shell

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}.

Funcศ›ionarea algoritmului de sortare Shell

Sorteazฤƒ prima sublistฤƒ. Tabloul devine:

Funcศ›ionarea algoritmului de sortare Shell

Dupฤƒ sortarea celei de-a doua subliste:

Funcศ›ionarea algoritmului de sortare Shell

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.

Funcศ›ionarea algoritmului de sortare Shell

Funcศ›ionarea algoritmului de sortare Shell

Funcศ›ionarea algoritmului de sortare Shell

Pas 6) รŽmpฤƒrศ›irea din nou a intervalului dฤƒ 0. Tabloul este acum complet sortat:

Funcศ›ionarea algoritmului de sortare Shell

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.

  1. Complexitatea รฎn cel mai bun caz: O(n log n)
  2. Complexitatea medie a cazurilor: O(n log n) pรขnฤƒ la O(n^(4/3)) รฎn funcศ›ie de secvenศ›a de gap-uri
  3. 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.

รŽntrebฤƒri frecvente

Sortarea prin shell este un algoritm de sortare prin comparaศ›ie in-place propus de Donald Shell รฎn 1959. Acesta generalizeazฤƒ sortarea prin inserศ›ie prin compararea elementelor care sunt departe unul de celฤƒlalt, apoi micศ™orรขnd spaศ›iul pรขnฤƒ cรขnd elementele adiacente sunt sortate, ceea ce reduce dramatic numฤƒrul de schimbฤƒri (swap-uri).

Complexitatea temporalฤƒ รฎn cel mai bun caz este O(n log n), iar complexitatea รฎn cel mai rฤƒu caz este O(n^2) cu secvenศ›a originalฤƒ a lui Shell. Secvenศ›ele cu gap-uri mai bune, cum ar fi cele ale lui Sedgewick, reduc cel mai rฤƒu caz la aproximativ O(n^(4/3)). Complexitatea spaศ›ialฤƒ este O(1).

Nu, sortarea prin shell nu este stabilฤƒ. Deoarece elementele sunt comparate ศ™i schimbate รฎn goluri mari, douฤƒ chei egale รฎศ™i pot schimba ordinea relativฤƒ รฎn timpul unei treceri. Dacฤƒ stabilitatea conteazฤƒ, utilizaศ›i รฎn schimb sortarea prin รฎmbinare sau o variantฤƒ stabilฤƒ de sortare prin inserศ›ie.

Sortarea prin inserศ›ie mutฤƒ elementele cรขte o poziศ›ie pe rรขnd. Sortarea Shell comparฤƒ mai รฎntรขi elementele care sunt depฤƒrtate, apoi micศ™oreazฤƒ progresiv spaศ›iul liber. Rezultatul este un tablou aproape sortat รฎn momentul รฎn care spaศ›iul liber ajunge la unu, astfel รฎncรขt pasul final de sortare prin inserศ›ie se terminฤƒ foarte repede.

Asistenศ›ii inteligenศ›i artificiali pot analiza dimensiunea, distribuศ›ia ศ™i constrรขngerile setului de date, apoi pot recomanda un algoritm precum Shell Sort, quicksort sau radix sort. De asemenea, pot genera scripturi de referinศ›ฤƒ care comparฤƒ timpul de execuศ›ie ศ™i utilizarea memoriei, astfel รฎncรขt sฤƒ puteศ›i valida recomandarea pe sarcini de lucru reale.

Da. Instrumentele de inteligenศ›ฤƒ artificialฤƒ pot genera vizualizฤƒri animate ale sortฤƒrii Shell care evidenศ›iazฤƒ grupurile de lacune, comparaศ›iile ศ™i schimbฤƒrile รฎn timp real. Astfel de vizualizฤƒri รฎi ajutฤƒ pe cursanศ›i sฤƒ vadฤƒ cum se micศ™oreazฤƒ intervalul ศ™i cum converge matricea cฤƒtre o stare sortatฤƒ pas cu pas.

Rezumaศ›i aceastฤƒ postare cu: