Un fel de agitator

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Un fel de agitator
Clasă Algoritm de sortare
Structură de date Matrice
Cel mai rău caz din punct de vedere temporal О (n²)
Optim Nu

În informatică, sortarea Shaker , cunoscută și sub numele de sortare bidirecțională cu bulă , sortare cocktail , sortare cocktail shaker , sortare Ripple , sortare Happy hour sau sortare Shuttle este un algoritm de sortare a datelor dezvoltat de Sun Microsystems . Sortarea agitatorului este în esență o variantă a sortării cu bule : diferă de acesta din urmă pentru indicele ciclului cel mai intern care, în loc să ruleze de la început până la sfârșit, își inversează direcția la fiecare ciclu. În timp ce menține aceeași complexitate , adică O (n²) , sortarea agitatorului reduce probabilitatea ca sortarea să aibă un cost corespunzător celui mai rău caz .

Notă: Pentru a înțelege următoarele, este necesar să înțelegeți funcționarea generală a sortării cu bule .

Pseudo cod

Cea mai simplă formă a agitatorului de sortare derulează întreaga listă la fiecare pas (cazul sortării descendente este prezentat mai jos):

 procedure shakerSort (A : lista articolelor care trebuie sortate) definit ca:
  do
    schimbat: = false
    pentru fiecare i în 0 până la lungimea (A) - 2 faceți:
      dacă A [i]> A [i + 1] atunci // verificați dacă cele 2 elemente sunt în ordine greșită
        swap (A [i], A [i + 1]) // swap cele 2 elemente
        schimbat: = true
      incheie daca
    sfârșit pentru
    dacă se schimbă = fals atunci
      // dacă nu se efectuează schimburi, bucla cea mai exterioară poate fi ieșită
      rupe bucla do-while
    incheie daca
    schimbat: = false
    pentru fiecare i în lungime (A) - 2 până la 0 faceți:
      dacă A [i]> A [i + 1] atunci
        swap (A [i], A [i + 1])
        schimbat: = true
      incheie daca
    sfârșit pentru
  în timp ce se schimbă // dacă nu au fost efectuate swap-uri, atunci lista este sortată
încheierea procedurii

Primul pas spre dreapta va muta cel mai mare element în poziția corectă la sfârșitul listei, în timp ce următorul pas spre stânga va muta cel mai mic element în poziția corectă din partea de sus a listei. A doua trecere completă se va muta de- al doilea cel mai mare și al doilea cel mai mic element în poziția corectă, și așa mai departe: după „“ trece mai întâi „elementele“ a și ultimul „elementele“ ale listei vor fi poziționate corect, și nu va trebui să le verificați de două ori. Numărul de operații poate fi redus prin scurtarea părții din listă care este sortată la fiecare pas.


 procedure cocktailSort (A : lista articolelor de sortat) definit ca:
  // „începe” și „sfârșit” marchează primul și ultimul index de verificat
  începe: = -1
  final: = lungime (A) - 2
  do
    schimbat: = false
    // incrementează `începe`, deoarece elementele dinaintea„ începe` sunt sortate corect
    începe: = începe + 1
    pentru fiecare i în a începe  se încheie face:
      dacă A [i]> A [i + 1] atunci
        swap (A [i], A [i + 1])
        schimbat: = true
      incheie daca
    sfârșit pentru
    dacă se schimbă = fals atunci
      rupe bucla do-while
    incheie daca
    schimbat: = false
    // decrementează `end` deoarece elementele de după„ end` sunt sortate corect
    sfârșit: = sfârșit - 1
    pentru fiecare i în cele din urmă pentru a începe faceți:
      dacă A [i]> A [i + 1] atunci
        swap (A [i], A [i + 1])
        schimbat: = true
      incheie daca
    sfârșit pentru
  în timp ce era schimbat
încheierea procedurii

Explicaţie

Sortarea cu bule are o asimetrie intrinsecă: valorile matricei sunt mutate rapid într-o direcție (și exact în cea în care scanarea matricei continuă în timpul unei iterații) și încet în cealaltă direcție. De exemplu, dacă matricea este scanată înainte și numerele sunt aranjate în ordine crescătoare, numerele mari vor avansa rapid, numerele mici se vor mișca înapoi încet. Putem clarifica mai bine acest concept cu acest exemplu. Luați în considerare această mică matrice:

 15 4 10 11 2

În timpul primei iterații, 15 este mutat în mod repetat (vezi sortarea cu bule ), cu următorul rezultat final:

 4 10 11 2 15

Prin urmare, se poate vedea că în arcul unei singure iterații, „15” (numărul maxim care era în prima poziție) a traversat întreaga matrice. „2”, care se afla într-o situație simetrică (număr minim în ultima poziție), a făcut în schimb doar un pas către locația sa finală.

În general, un număr destinat poziției N și plasat inițial în poziția M , unde N < M , va necesita iterații M - N pentru a ajunge la celula de destinație. Dacă, pe de altă parte, M < N , deplasarea acestuia va fi în medie mai rapidă. Cazul particular în care numărul destinat primei poziții a matricei este în ultima corespunde unei situații de „cel mai rău caz” al bubbleortului, în care toate iterațiile N -1 ale algoritmului vor fi necesare pentru a obține matricea ordonată .

Shakersort

Denumirea de tip shaker (sortarea „un shaker”, care se referă la instrumentul pentru prepararea cocktailurilor ) sugerează destul de clar modul în care sortul shaker modifică sortarea cu bule. În loc să derulați întotdeauna matricea în aceeași direcție (favorizând astfel deplasările valorilor în acea direcție), sortarea shaker alternează pur și simplu o scanare înainte și una înapoi.

Toate optimizările și variantele prevăzute pentru sortarea cu bule sunt aplicabile, cu adaptările necesare, și la sortarea shaker.

Alte proiecte

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT