logo

Sortare liniară în timp

Introducere

Sortarea este o operație esențială în informatică care implică aranjarea elementelor într-o ordine specifică, cum ar fi ordinea numerică sau alfabetică. Au fost dezvoltați diverși algoritmi de sortare, fiecare cu indicatori de timp și eficiență. Sortarea liniară în timp este un subset de algoritmi de sortare cu un avantaj semnificativ: pot sorta un anumit set de elemente în timp liniar, timpul de rulare crește liniar cu dimensiunea de intrare.

Cel mai cunoscut algoritm de sortare liniară în timp este sortarea descendentă. Sortarea computațională este deosebit de eficientă atunci când gama de elemente de intrare este cunoscută și relativ mică. Acest lucru elimină necesitatea de a compara elemente, principala operație care consumă timp în mulți alți algoritmi de sortare. Folosind cunoștințele din domeniul de intrare, sortarea computațională atinge complexitatea timpului liniar. O sortare numerică scanează mai întâi tabloul de intrare pentru a determina numărul fiecărui element. Apoi folosește aceste numere pentru a calcula pozițiile corecte ale elementelor din tabelul de rezultate ordonat. Algoritmul constă din următorii pași:

  1. Pentru a determina intervalul, identificați valorile minime și maxime ale matricei de intrare.
  2. Creați o foaie de lucru inițializată cu dimensiunea intervalului și zerouri.
  3. Iterați peste matricea de intrare și incrementați fiecare element găsit.
  4. Modificați foaia de lucru calculând totalul cumulat pentru a obține pozițiile corecte pentru fiecare element.
  5. Creați o matrice de ieșire de aceeași dimensiune ca și matricea de intrare.
  6. Mutați din nou matricea de intrare, plasând fiecare element în poziția corectă în matricea de ieșire pe baza foii de lucru.
  7. Tabelul de rezultate conține acum elemente sortate.
Sortare liniară în timp

Principalul avantaj al sortării descendente este că atinge o complexitate de timp liniară de O(n), ceea ce o face foarte eficientă pentru dimensiuni mari de intrare. Cu toate acestea, aplicabilitatea sa este limitată la scenarii în care alegerea elementelor de intrare este cunoscută dinainte și relativ mică.

Este important de reținut că alți algoritmi de sortare, cum ar fi sortarea rapidă sau îmbinare, au de obicei o complexitate de timp de O(n log n), care este considerată eficientă pentru multe aplicații practice. Algoritmii de sortare liniară în timp, cum ar fi sortarea numerică, oferă o alternativă atunci când anumite constrângeri sau proprietăți ale intrării permit utilizarea complexității timpului liniar.

Istorie

Algoritmii de sortare liniară în timp au o istorie bogată în informatică. Dezvoltarea ordinii liniare a timpului poate fi urmărită până la mijlocul secolului al XX-lea, iar contribuțiile oamenilor de știință și ale matematicienilor au fost semnificative. Unul dintre cei mai vechi algoritmi de sortare liniară în timp este sortarea găleților, propus de Harold H. Seward în 1954. O sortare găleată împarte elementele de intrare într-un număr finit de găleți și apoi sortează fiecare găleată separat. Acest algoritm are complexitate liniară în timp dacă distribuția elementelor de intrare este relativ uniformă.

În 1959, Kenneth E. Iverson a introdus un algoritm radix care atinge complexitatea timpului liniar. Radix sortează elementele după numere sau semne de la cel mai puțin semnificativ la cel mai semnificativ. Folosește algoritmi de sortare robusti, cum ar fi sortarea numerică sau tip bucket sort, pentru a sorta elementele în fiecare locație de cifre. Sortarea Radix a devenit populară în epoca cardurilor perforate și a sistemelor informatice timpurii. Cu toate acestea, cel mai cunoscut algoritm de sortare liniară în timp este o enumerare, introdusă de Harold H. Seward și Peter Elias în 1954 și mai târziu redescoperită independent de Harold H. „Bobby” Johnson în 1961. Sortarea numerică a primit o atenție considerabilă.

convertiți șirul în int java

Acest lucru este deosebit de eficient atunci când gama de elemente de intrare este cunoscută și relativ mică. Istoria sortării liniare în timp a continuat cu dezvoltarea altor algoritmi specializați. De exemplu, în 1987, Hanan Samet a propus sortarea arborelui de distribuție binară, un algoritm de sortare liniară în timp pentru date multidimensionale. De-a lungul anilor, cercetătorii au continuat să studieze și să îmbunătățească algoritmii de programare liniară, concentrându-se pe scenarii și constrângeri specifice. Deși algoritmii precum sortarea rapidă și îmbinarea sunt folosiți mai pe scară largă pentru eficiența lor în mai multe scenarii, algoritmii de sortare în timp liniar oferă alternative valoroase atunci când anumite circumstanțe permit exploatarea complexității timpului liniar. În general, istoria sortării liniare în timp se caracterizează prin căutarea unor algoritmi eficienți care pot sorta seturi mari de date în timp liniar, depășind limitările algoritmilor de sortare bazați pe comparație. Contribuțiile diverșilor cercetători au deschis calea dezvoltării și înțelegerii acestor tehnici de sortare specializate.

Tipuri de sortare liniară în timp

Există mai mulți algoritmi diferiți de sortare liniară în timp. Cele două tipuri principale sunt algoritmi bazați pe numărare și algoritmi bazați pe radix. Iată cei mai comuni algoritmi de sortare liniară în timp, clasificați pe baza următoarelor tipuri:

Algoritmi bazați pe numărare

    Sortare bazată pe numărare:Bazat pe numărare este un algoritm de sortare non-comparativ. Acesta numără apariția fiecărui element în matricea de intrare și folosește aceste informații pentru a determina poziția corectă a fiecărui element în matricea de ieșire sortată. Sortarea bazată pe numărare presupune că elementele de intrare sunt numere întregi sau pot fi adăugate la numere întregi.

Algoritmi bazați pe radix

    Sort Radix:Radix Sort este un algoritm de sortare care nu se bazează pe comparație care sortează elementele după numere sau caractere. Numărează fiecare număr sau semn din elementele de la cel mai puțin semnificativ număr până la cel mai semnificativ Sortarea radicală presupune că elementele de intrare sunt numere întregi sau șiruri.Sortare găleată:Bucket Sort este o variantă a Radix Sort care împarte elementele în grupuri fixe în funcție de intervalul sau distribuția lor. Fiecare segment este sortat separat folosind un algoritm de sortare diferit sau bin-sort recursiv.Sortare radiculară MSD (cifra cea mai semnificativă):MSD Radix Sort este o variantă a sortării radix care începe sortarea elementelor pe baza celor mai semnificative. Împarte recursiv elementele în subgrupe pe baza valorii numărului curent și aplică MSD Radix Sort fiecărui subgrup până când toate numerele au fost numărate.Sortare pe bază de LSD (cifra cel mai puțin semnificativă):LSD Radix Sort este o altă variantă care începe sortarea elementelor pe baza lor cea mai puțin semnificativă. Sortează recursiv elementele în funcție de fiecare număr de la dreapta la stânga, producând un rezultat sortat. Atât algoritmii de sortare bazați pe numărare, cât și bazați pe rădăcină ating o complexitate liniară în timp prin exploatarea proprietăților specifice ale elementelor de intrare, cum ar fi domeniul sau structura lor reprezentativă (de exemplu, numere sau caractere). Cu toate acestea, aplicabilitatea lor poate varia în funcție de caracteristicile datelor de intrare.

Avantajele sortării liniare în timp

Algoritmii de sortare liniară în timp, cum ar fi sortarea numerică, oferă mai multe avantaje în scenarii specifice.

    Eficient pentru dimensiuni mari de intrare:Complexitatea în timp a algoritmilor de sortare liniară în timp este O(n), ceea ce înseamnă că timpul de rulare crește liniar cu dimensiunea de intrare. Acest lucru le face foarte eficiente pentru seturi mari de date în comparație cu algoritmii de sortare bazați pe comparație, cum ar fi algoritmii de sortare rapidă sau de îmbinare, care au de obicei o complexitate de timp de O(n log n).Fără operații de comparare:Algoritmii de sortare în timp liniar, cum ar fi sortarea enumerare, nu se bazează pe comparație elementară. În schimb, folosesc atribute sau informații specifice despre elementele de intrare, cum ar fi extinderea sau distribuția acestora. Această caracteristică le face avantajoase atunci când costul comparației este mare, cum ar fi pentru obiecte complexe sau operațiuni costisitoare de comparare.Adecvarea la proprietăți specifice de intrare:Algoritmii de sortare în timp liniar au adesea cerințe sau ipoteze specifice despre elementele de intrare. De exemplu, pentru a calcula o ordine de sortare, trebuie să cunoașteți în prealabil gama de elemente de intrare. Când aceste condiții sunt îndeplinite, algoritmii de sortare liniară în timp pot oferi avantaje semnificative de performanță față de algoritmii generali de sortare.Sortare stabilă:Mulți algoritmi de sortare în timp liniar, inclusiv sortarea numerică și radix, sunt în mod inerent stabili. Consecvența înseamnă că elementele cu chei sau valori duplicate mențin ordinea relativă în rezultatul sortat. Acest lucru poate fi critic atunci când sortați obiecte sau înregistrări cu atribute multiple sau când păstrarea ordinii inițiale a elementelor de valoare egală este esențială.Ușurință în utilizare:Algoritmii de sortare liniară în timp, cum ar fi sortarea enumerare, sunt adesea relativ ușor de implementat în comparație cu algoritmii de sortare mai complexi bazați pe comparație. Ele pot fi mai ușor de înțeles și de depanat, făcându-le potrivite pentru situațiile în care se dorește simplitate și claritate.

Dezavantajele sortării liniare în timp

Deși algoritmii de planificare liniară au avantajele lor, au și anumite limitări și dezavantaje:

    Constrângerea cerințelor de intrare:Algoritmii de sortare liniară în timp au adesea cerințe sau ipoteze specifice despre elementele de intrare. De exemplu, pentru a calcula o ordine de sortare, trebuie să cunoașteți în prealabil gama de elemente de intrare. Această restricție limitează aplicabilitatea acestora la situațiile în care aceste condiții sunt îndeplinite. Cerințele de memorie pot deveni impracticabile sau pot depăși resursele disponibile dacă intervalul este extins sau necunoscut.Cerințe suplimentare de spațiu:Unii algoritmi de sortare liniară în timp, cum ar fi sortarea numerică, necesită spațiu suplimentar pentru a stoca alte matrice sau structuri de date. Spațiul necesar este adesea proporțional cu numărul de elemente de intrare. Acest lucru poate fi un dezavantaj atunci când utilizarea memoriei este o problemă, în special atunci când aveți de-a face cu seturi mari de date sau resurse limitate de memorie.Lipsa de versatilitate:Algoritmii de sortare liniară în timp sunt algoritmi specializați proiectați pentru scenarii sau constrângeri specifice. Este posibil ca acestea să fie mai potrivite și mai eficiente pentru sarcini generale de sortare sau diferite distribuții de intrare. Algoritmii de sortare bazați pe comparație, cum ar fi sortarea rapidă sau îmbinarea, sunt mai versatili și pot gestiona o gamă mai largă de intervale de intrare.Ineficient pentru intervale mici sau date rare:Algoritmii de sortare în timp liniar, cum ar fi enumerarea, sunt cei mai eficienți atunci când gama de elemente de intrare este mică și dens distribuită. Dacă intervalul este extins sau datele sunt rare (adică doar câteva valori distincte), algoritmul poate economisi timp și efort în procesarea porțiunilor goale sau slab populate ale intervalului de intrare.Limitat la anumite tipuri de date:Algoritmii de sortare în timp liniar, cum ar fi sortarea prin enumerare, sunt proiectați în primul rând pentru a sorta numere întregi nenegative sau obiecte cheie-valoare. Este posibil să nu fie potrivite pentru sortarea altor tipuri de date, cum ar fi numere în virgulă mobilă, șiruri de caractere sau structuri complexe de date. Adaptarea algoritmilor de sortare liniară în timp pentru a gestiona diferite tipuri de date sau funcții de comparare personalizate poate necesita preprocesare sau modificări suplimentare.

Atunci când alegeți un algoritm de sortare, este esențial să luați în considerare cu atenție specificul datelor de intrare și cerințele problemei de sortare. În timp ce algoritmii de planificare liniară oferă avantaje în scenarii specifice, ei sunt doar uneori cea mai potrivită sau eficientă alegere.

Aplicații ale algoritmilor de sortare liniară în timp

Algoritmii de sortare liniară în timp sunt eficienți și au multe aplicații în diverse domenii. Iată câteva aplicații tipice ale ordinii de timp lineare:

    Sortarea numerelor întregi cu intervale mici:Algoritmii de sortare liniară în timp, cum ar fi sortarea numărului și sortarea radix, sunt ideali pentru sortarea rețelelor de numere întregi atunci când intervalul de valori este. Acești algoritmi obțin o complexitate liniară în timp făcând ipoteze despre datele de intrare, permițându-le să ocolească sortarea bazată pe comparație.Sortarea șirurilor:Algoritmii de sortare liniară în timp pot fi aplicați și pentru a sorta eficient șirurile. Luând proprietăți unice ale șirurilor, cum ar fi lungimea sau caracterele acestora, algoritmi precum Radix Sort pot obține o complexitate liniară în timp atunci când sortează șirurile.Funcții baze de date:Sortarea este o funcție esențială a algoritmilor de sortare liniară în timp pot sorta eficient seturi mari de date pe baza unor coloane sau câmpuri specifice. Acest lucru permite o procesare mai rapidă a interogărilor și o performanță mai bună în operațiunile cu bazele de date.Crearea histogramelor:Histogramele sunt esențiale pentru diverse sarcini statistice și de analiză a datelor. Algoritmii de sortare liniară în timp, cum ar fi sortarea numerică, pot genera histograme prin numărarea eficientă a aparițiilor elementelor dintr-un set de date.Sortare externă:Tehnica de sortare externă este utilizată în scenariile în care datele nu pot încăpea complet în memorie. Algoritmii de sortare liniară în timp, cum ar fi Sortarea Radix Externă sau Sortarea Numărării Externe pot sorta eficient seturi mari de date stocate pe disc sau alte dispozitive de stocare externe.Programarea evenimentelor:Algoritmii de sortare liniară în timp pot programa evenimente pe baza orelor de început sau de sfârșit. Sortarea evenimentelor în ordine crescătoare facilitează identificarea conflictelor, perioadelor suprapuse sau găsirea următoarei perioade disponibile.Analizarea fișierelor jurnal:Analiza fișierelor jurnal este o sarcină comună în administrarea și depanarea sistemului. Algoritmii de sortare liniară în timp pot fi utilizați pentru a sorta jurnalele pe baza marcajelor de timp, facilitând identificarea modelelor, anomaliilor sau căutarea unor evenimente specifice.Comprimarea datelor:Sortarea joacă un rol esențial în diferite tehnici de comprimare a datelor. Algoritmi precum Burrows-Wheeler Transform (BWT) sau Move-To-Front Transform (MTF) se bazează pe ordonarea liniară în timp pentru a rearanja datele pentru a îmbunătăți eficiența compresiei. Acestea sunt doar câteva exemple de aplicații ale algoritmilor de sortare liniară în timp.

Implementarea sortării liniare în timp în C++

Iată un exemplu de program care implementează Counting Sort, care este un algoritm de sortare liniară în timp:

 #include #include using namespace std; void countingSort(vector&amp; arr) { // Find the maximum element in the array int max_val = *max_element(arr.begin(), arr.end()); // Create a count array to store the count of each element vector count(max_val + 1, 0); // Count the occurrences of each element for (int num : arr) { count[num]++; } // Compute the prefix sum for (int i = 1; i <count.size(); i++) { count[i] +="count[i" - 1]; } create a sorted output array vector output(arr.size()); place the elements in order for (int i="arr.size()" 1;>= 0; i--) { output[count[arr[i]] - 1] = arr[i]; count[arr[i]]--; } // Copy the sorted elements back to the original array for (int i = 0; i <arr.size(); i++) { arr[i]="output[i];" } int main() vector arr="{4," 2, 8, 3, 1}; sort the array using counting countingsort(arr); print sorted cout << 'sorted array: '; for (int num : arr) ' endl; return 0; < pre> <p> <strong>Sample Output</strong> </p> <pre> Sorted array: 1 2 2 3 3 4 8 </pre> <p>This indicates that the input array has been sorted in ascending order using the Counting Sort algorithm, resulting in the sorted array [1, 2, 2, 3, 3, 4, 8].</p> <p>In this C++ program, the counting sort function takes a reference to the vector arr and runs the counting sort routine. It finds the table&apos;s maximum value to determine the worksheet&apos;s size. It then counts each element&apos;s occurrence and calculates the worksheet&apos;s prefix sum. Then, it creates a result vector and puts the elements in order according to the worksheet. Finally, it copies the sorted elements back into the original array. In the primary function, the example array {4, 2, 2, 8, 3, 3, 1} is sorted by the enumeration sort algorithm and printed as a sorted matrix. Note that the program uses libraries to work with vectors and find the maximum element of an array using the max_element function.</p> <hr></arr.size();></count.size();>

Aceasta indică faptul că matricea de intrare a fost sortată în ordine crescătoare utilizând algoritmul Counting Sort, rezultând matricea sortată [1, 2, 2, 3, 3, 4, 8].

sintaxa git pull

În acest program C++, funcția de sortare de numărare ia o referință la vectorul arr și rulează rutina de sortare de numărare. Găsește valoarea maximă a tabelului pentru a determina dimensiunea foii de lucru. Apoi numără apariția fiecărui element și calculează suma prefixului foii de lucru. Apoi, creează un vector de rezultat și pune elementele în ordine conform foii de lucru. În cele din urmă, copiază elementele sortate înapoi în matricea originală. În funcția primară, exemplul de tablou {4, 2, 2, 8, 3, 3, 1} este sortat de algoritmul de sortare de enumerare și imprimat ca o matrice sortată. Rețineți că programul folosește biblioteci pentru a lucra cu vectori și pentru a găsi elementul maxim al unui tablou folosind funcția max_element.