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:
- Pentru a determina intervalul, identificați valorile minime și maxime ale matricei de intrare.
- Creați o foaie de lucru inițializată cu dimensiunea intervalului și zerouri.
- Iterați peste matricea de intrare și incrementați fiecare element găsit.
- Modificați foaia de lucru calculând totalul cumulat pentru a obține pozițiile corecte pentru fiecare element.
- Creați o matrice de ieșire de aceeași dimensiune ca și matricea de intrare.
- 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.
- Tabelul de rezultate conține acum elemente sortate.
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
Algoritmi bazați pe radix
Avantajele sortării liniare în timp
Algoritmii de sortare liniară în timp, cum ar fi sortarea numerică, oferă mai multe avantaje în scenarii specifice.
Dezavantajele sortării liniare în timp
Deși algoritmii de planificare liniară au avantajele lor, au și anumite limitări și dezavantaje:
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:
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& 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's maximum value to determine the worksheet's size. It then counts each element's occurrence and calculates the worksheet'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.