Algoritmul de sortare

deși există un număr mare de algoritmi de sortare, în implementările practice predomină câțiva algoritmi. Insertion sort este utilizat pe scară largă pentru seturi mici de date, în timp ce pentru seturi mari de date este utilizat un fel asimptotic eficient, în primul rând heap sort, merge sort, sau quicksort. Implementările eficiente folosesc în general un algoritm hibrid, combinând un algoritm asimptotic eficient pentru sortarea generală cu sortarea inserției pentru liste mici în partea de jos a unei recursiuni., Foarte fin implementări folosi mai sofisticate variante, cum ar fi Timsort (un fel de îmbinare, un fel de introducere, și suplimentare logica), folosit în Android, Java, Python, și introsort (quicksort și heap sort), folosit (în varianta forme) în unele C++ fel implementări și în .NET.

Pentru mai multe date limitate, cum ar fi numere într-un interval fix, distribuție felul cum ar fi de numărare fel sau radix sort sunt utilizate pe scară largă. Bubble sort și variante sunt rareori utilizate în practică, dar sunt frecvent întâlnite în predare și discuții teoretice.,

când sortează fizic obiecte (cum ar fi hârtii, teste sau cărți în ordine alfabetică), oamenii intuitiv folosesc, în general, sorturi de inserție pentru seturi mici. Pentru seturi mai mari, oamenii de multe ori prima găleată, cum ar fi prin scrisoarea inițială, și bucketing multiple permite sortarea practice de seturi foarte mari. Adesea, spațiul este relativ ieftin, cum ar fi prin răspândirea obiectelor pe podea sau pe o suprafață mare, dar operațiunile sunt costisitoare, în special mutarea unui obiect la o distanță mare – localitatea de referință este importantă., Merge sortează sunt, de asemenea, practice pentru obiecte fizice, în special ca două mâini pot fi folosite, una pentru fiecare listă pentru a fuziona, în timp ce alți algoritmi, cum ar fi heap sort sau quick sort, sunt slab potrivite pentru uz uman. Alți algoritmi, cum ar fi library sort, o variantă de sortare de inserție care lasă spații, sunt, de asemenea, practice pentru utilizare fizică.două dintre cele mai simple tipuri sunt insertion sort și selection sort, ambele fiind eficiente pe date mici, din cauza costurilor reduse, dar nu eficiente pe date mari., Sortarea inserției este, în general, mai rapidă decât sortarea selecției în practică, datorită mai puține comparații și performanțe bune pe date aproape sortate și, prin urmare, este preferată în practică, dar sortarea selecției folosește mai puține scrieri și, prin urmare, este utilizată atunci când performanța de scriere este un factor limitativ.

Insertion sortEdit

Articol principal: Insertion sort

Insertion sort este un algoritm de sortare simplu, care este relativ eficient pentru liste mici și liste sortate cea mai mare parte, și este adesea folosit ca parte a algoritmilor mai sofisticate., Funcționează luând elemente din listă unul câte unul și introducându-le în poziția lor corectă într-o nouă listă sortată similar cu modul în care punem bani în portofel. În matrice, noua listă și elementele rămase pot partaja spațiul matricei, dar inserarea este costisitoare, necesitând schimbarea tuturor elementelor următoare cu unul. Shellsort (vezi mai jos) este o variantă de inserare sortare care este mai eficient pentru liste mai mari.

selecție sortEdit

Articol principal: Sortare selecție

Sortare selecție este un fel de comparație în loc., Are o complexitate (n2), ceea ce îl face ineficient pe listele mari și, în general, are performanțe mai slabe decât tipul de inserție similar. Sortare selecție este remarcat pentru simplitatea sa, și are, de asemenea, avantaje de performanță față de algoritmi mai complicate în anumite situații.algoritmul găsește valoarea minimă, o schimbă cu valoarea din prima poziție și repetă acești pași pentru restul listei. Ea nu mai mult de n swap-uri, și, astfel, este util în cazul în care schimbarea este foarte scump.,algoritmii practici de sortare generală se bazează aproape întotdeauna pe un algoritm cu complexitate medie în timp (și, în general, complexitate în cel mai rău caz) O(n log n), dintre care cele mai frecvente sunt heap sort, merge sort și quicksort. Fiecare are avantaje și dezavantaje, cu cele mai importante fiind faptul că punerea în aplicare simplă a merge sort utilizează o(n) spațiu suplimentar, și punerea în aplicare simplă a quicksort are o(n2) complexitatea cel mai rău caz. Aceste probleme pot fi rezolvate sau ameliorate cu costul unui algoritm mai complex.,în timp ce acești algoritmi sunt eficienți asimptotic pe date aleatorii, pentru eficiența practică a datelor din lumea reală sunt utilizate diverse modificări. În primul rând, deasupra capului acestor algoritmi devine semnificativă pe date mai mici, atât de des este folosit un algoritm hibrid, de obicei trecerea la Inserare sortare odată ce datele sunt suficient de mici. În al doilea rând, algoritmii au adesea performanțe slabe pe date deja sortate sau date aproape sortate – acestea sunt comune în datele din lumea reală și pot fi sortate în timp O(n) prin algoritmi adecvați., În cele din urmă, ele pot fi, de asemenea, instabile, iar stabilitatea este adesea o proprietate dorită într-un fel. Astfel, mai sofisticate algoritmi sunt adesea folosite, cum ar fi Timsort (bazat pe un fel de îmbinare) sau introsort (bazat pe quicksort, care se încadrează înapoi la heap sort).

Merge sortEdit

Articol principal: Merge sort

Merge sort profită de ușurința fuzionării listelor deja sortate într-o nouă listă sortată. Începe prin compararea a două elemente (adică 1 cu 2, apoi 3 cu 4…) și schimbarea lor dacă primul ar trebui să vină după al doilea., Apoi fuzionează fiecare dintre listele rezultate de două în liste de patru, apoi fuzionează aceste liste de patru, și așa mai departe; până la cele din urmă două liste sunt îmbinate în lista finală sortate. Dintre algoritmii descriși aici, acesta este primul care scalează bine la liste foarte mari, deoarece timpul său de funcționare cel mai rău caz este O(n log n). De asemenea, este ușor de aplicat listelor, nu numai matricelor, deoarece necesită doar acces secvențial, nu acces aleatoriu. Cu toate acestea, are o complexitate suplimentară a spațiului O(n) și implică un număr mare de copii în implementări simple.,Merge sort a înregistrat o creștere relativ recentă a popularității implementărilor practice, datorită utilizării sale în algoritmul sofisticat Timsort, care este utilizat pentru rutina de sortare standard în limbajele de programare Python și Java (ca de JDK7). Merge sort în sine este rutina standard în Perl, printre altele, și a fost folosit în Java cel puțin din 2000 în JDK1.3.

HeapsortEdit

Articol principal: Heapsort

Heapsort este o versiune mult mai eficientă de sortare selecție., De asemenea, funcționează prin determinarea celui mai mare (sau mai mic) element al listei, plasându-l la sfârșitul (sau începutul) listei, continuând apoi cu restul listei, dar îndeplinește această sarcină eficient folosind o structură de date numită heap, un tip special de arbore binar. Odată ce lista de date a fost făcută într-o grămadă, nodul rădăcină este garantat a fi cel mai mare (sau cel mai mic) element. Când este îndepărtat și plasat la sfârșitul listei, grămada este rearanjată astfel încât cel mai mare element rămas să se mute la rădăcină., Folosind heap-ul, găsirea următorului element cel mai mare necesită o(log n) timp, în loc de O(n) pentru o Scanare liniară ca în sortarea simplă a selecției. Acest lucru permite Heapsort pentru a rula în o(n log n) timp, iar acest lucru este, de asemenea, complexitatea cel mai rău caz.

QuicksortEdit

articol Principal: Quicksort

Quicksort este un algoritm divide și cuceri care se bazează pe o partiție de funcționare: pentru partiție o matrice, un element numit un pivot este selectat. Toate elementele mai mici decât pivotul sunt mutate înainte și toate elementele mai mari sunt mutate după el. Acest lucru se poate face eficient în timp liniar și în loc., Sublisturile mai mici și mai mari sunt apoi sortate recursiv. Aceasta produce o complexitate medie a timpului de O (n log n), cu cheltuieli reduse și, prin urmare, acesta este un algoritm popular. Implementările eficiente ale quicksort (cu partiționare la fața locului) sunt de obicei tipuri instabile și oarecum complexe, dar sunt printre cei mai rapizi algoritmi de sortare în practică. Împreună cu utilizarea modestă a spațiului O(log n), quicksort este unul dintre cei mai populari algoritmi de sortare și este disponibil în multe biblioteci de programare standard.,

important avertisment despre quicksort este că performanța sa cel mai rău caz este O(n2); în timp ce acest lucru este rar, în implementări naive (alegerea primului sau ultimului element ca pivot) acest lucru se întâmplă pentru datele sortate, care este un caz comun. Problema cea mai complexă în quicksort este astfel alegerea unui element pivot bun, ca alegeri în mod constant săraci de pivoți poate duce la drastic mai lent o(n2) performanță, dar o alegere bună de pivoți randamentele o(n log n) performanță, care este asimptotic optimă. De exemplu, dacă la fiecare pas mediana este aleasă ca pivot, atunci algoritmul funcționează în O (N log n)., Găsirea mediana, cum ar fi prin mediana algoritmului de selecție medians este totuși o operație O(n) pe liste nesortate și, prin urmare, exacts aeriene semnificative cu sortare. În practică, alegerea unui pivot aleatoriu produce aproape sigur o(n log n) performanță.

ShellsortEdit

Un Shell fel, diferit de sortare cu bule, în care se mișcă elemente numeroase schimbarea pozițiilor.

Articol principal: Shell sort

Shellsort a fost inventat de Donald Shell în 1959., Se îmbunătățește la Inserare sortare prin mutarea elementelor de ordine mai mult de o poziție la un moment dat. Conceptul din spatele Shellsort este ca un fel de introducere realizează în O ( k n ) {\displaystyle O(kn)} timp, unde k este cea mai mare distanță între două de elemente. Acest lucru înseamnă că, în general, ele efectuează în O(n2), dar pentru datele care sunt sortate în cea mai mare parte, cu doar câteva elemente în afara locului, acestea funcționează mai repede. Deci, sortând mai întâi elementele departe și micșorând progresiv decalajul dintre elementele de sortare, sortarea finală se calculează mult mai repede., O implementare poate fi descrisă ca aranjarea secvenței de date într-o matrice bidimensională și apoi sortarea coloanelor matricei folosind insertion sort.

complexitatea timpului cel mai rău caz al Shellsort este o problemă deschisă și depinde de secvența de decalaj utilizată, cu complexități cunoscute variind de la O(n2) la O(N4 / 3) și Θ(n log2 n)., Acest lucru, combinat cu faptul că Shellsort este în loc, are nevoie doar de o cantitate relativ mică de cod, și nu necesită utilizarea de stiva de apel, face este util în situații în care memoria este la o primă, cum ar fi în sistemele integrate și a sistemului de operare kernel.

Bubble sort și variantsEdit

această secțiune nu citează nicio sursă. Vă rugăm să ajutați la îmbunătățirea acestei secțiuni prin adăugarea de citări la surse de încredere. Materialele nesurse pot fi contestate și eliminate., (Mai 2019) (Aflați cum și când să eliminați acest mesaj șablon)

Bubble sort și variante precum shell sort și cocktail sort, sunt algoritmi de sortare simpli, extrem de ineficienți. Ele sunt frecvent observate în textele introductive datorită ușurinței analizei, dar sunt rareori utilizate în practică.

Bubble sortEdit

Un fel de balon, un algoritm de sortare, care în mod continuu pașii printr-o listă, făcând schimb de obiecte până când ele apar în ordinea corectă.,

Articol principal: Bubble sort

Bubble sort este un algoritm simplu de sortare. Algoritmul începe la începutul setului de date. Compară primele două elemente, iar dacă primul este mai mare decât al doilea, le schimbă. Continuă să facă acest lucru pentru fiecare pereche de elemente adiacente până la sfârșitul setului de date. Apoi începe din nou cu primele două elemente, repetând până când nu au avut loc swap-uri la ultima trecere. Timpul mediu al acestui algoritm și performanța în cel mai rău caz este O(n2), deci este rar folosit pentru a sorta seturi mari de date neordonate., Bubble sort poate fi folosit pentru a sorta un număr mic de articole (în cazul în care ineficiența asimptotică nu este o pedeapsă mare). Bubble sort poate fi, de asemenea, utilizat eficient pe o listă de orice lungime care este aproape sortată (adică elementele nu sunt în mod semnificativ în afara locului). De exemplu, dacă orice număr de elemente sunt în loc de doar o singură poziție (de exemplu, 0123546789 și 1032547698), un fel de bule de schimb le va primi în ordine pe prima trecere, la a doua trecere va găsi toate elementele în ordine, ca la fel va lua numai 2n timp.,

Pieptene sortEdit

articol Principal: Pieptene fel

Pieptene fel este relativ simplu algoritm de sortare bazat pe un fel de bule și proiectat inițial de Włodzimierz Dobosiewicz în 1980. Mai târziu a fost redescoperit și popularizat de Stephen Lacey și Richard Box cu un articol din revista Byte publicat în aprilie 1991. Ideea de bază este de a elimina țestoase, sau valori mici aproape de sfârșitul listei, deoarece într-un balon sortare acestea încetini sortarea în jos enorm., (Iepuri, valori mari în jurul valorii de la începutul listei, nu reprezintă o problemă în sortare cu bule) se realizează acest lucru prin schimbarea inițial elemente care sunt o anumită distanță unul de altul în matrice, mai degrabă decât doar schimbarea elementelor în cazul în care acestea sunt adiacente unul de altul, și apoi în scădere distanța aleasă până când funcționează ca un Astfel, în cazul în care Shellsort poate fi gândit ca o versiune generalizată a insertion sort care swaps elemente distanțate o anumită distanță unul de altul, pieptene sort poate fi gândit ca aceeași generalizare aplicată bubble sort.,

Distribution sortEdit

Vezi și: sortare externă

Distribution sort se referă la orice algoritm de sortare în care datele sunt distribuite de la intrarea lor la mai multe structuri intermediare care sunt apoi adunate și plasate pe ieșire. De exemplu, atât bucket sort cât și flashsort sunt algoritmi de sortare pe bază de distribuție. Algoritmii de sortare a distribuției pot fi utilizați pe un singur procesor sau pot fi un algoritm distribuit, unde subseturile individuale sunt sortate separat pe diferite procesoare, apoi combinate., Acest lucru permite sortarea externă a datelor prea mari pentru a se încadra în memoria unui singur computer.

numărarea sortEdit

Articol principal: numărarea sortare

numărarea sortare este aplicabilă atunci când fiecare intrare este cunoscut de a aparține unui anumit set, s, de posibilități. Algoritmul rulează în O (/S / + n) timp și o(|S|) memorie unde n este lungimea de intrare. Funcționează prin crearea unei matrice întregi de dimensiune / S / și folosind bin-ul ith pentru a număra aparițiile celui de-al it-lea membru al lui S în intrare. Fiecare intrare este apoi contorizată prin incrementarea valorii coșului său corespunzător., După aceea, matricea de numărare este buclată pentru a aranja toate intrările în ordine. Acest algoritm de sortare adesea nu poate fi folosit deoarece S trebuie să fie rezonabil de mic pentru ca algoritmul să fie eficient, dar este extrem de rapid și demonstrează un comportament asimptotic mare pe măsură ce n crește. De asemenea, poate fi modificat pentru a oferi un comportament stabil.

Bucket sortEdit

Articol principal: Bucket sort

Bucket sort este un algoritm de sortare divide și conquer care generalizează numărarea sortează prin Partiționarea unui tablou într-un număr finit de găleți., Fiecare găleată este apoi sortate individual, fie folosind un algoritm de sortare diferit, sau prin aplicarea recursiv algoritmul de sortare găleată.un fel de găleată funcționează cel mai bine atunci când elementele setului de date sunt distribuite uniform pe toate gălețile.

Radix sortEdit

Articol principal: Radix sort

Radix sort este un algoritm care sortează numerele prin procesarea cifrelor individuale. n numere formate din k cifre fiecare sunt sortate în O (n · k) timp., Radix sort poate procesa cifre ale fiecărui număr, fie pornind de la cea mai mică cifră semnificativă (LSD) sau pornind de la cea mai semnificativă cifră (MSD). Algoritmul LSD sortează mai întâi lista cu cea mai mică cifră semnificativă, păstrând în același timp ordinea lor relativă folosind un fel stabil. Apoi le sortează după următoarea cifră și așa mai departe de la cel mai puțin semnificativ la cel mai semnificativ, terminând cu o listă sortată. În timp ce sortarea LSD radix necesită utilizarea unui fel stabil, algoritmul de sortare MSD radix nu (cu excepția cazului în care se dorește sortarea stabilă). În loc MSD radix fel nu este stabil., Este obișnuit ca algoritmul de sortare a numărării să fie utilizat intern de sortarea radix. O abordare de sortare hibridă, cum ar fi utilizarea sortării de inserție pentru pubele mici, îmbunătățește semnificativ performanța sortării radix.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *