Uvod
Sortiranje je bitna operacija u računalnoj znanosti koja uključuje slaganje elemenata određenim redoslijedom, kao što je numerički ili abecedni red. Razvijeni su različiti algoritmi sortiranja, svaki s pokazateljima vremena i učinkovitosti. Linearno sortiranje vremena je podskup algoritama sortiranja sa značajnom prednošću: oni mogu sortirati dati skup elemenata u linearnom vremenu, vrijeme izvođenja se povećava linearno s veličinom ulaza.
Najpoznatiji algoritam linearnog vremenskog sortiranja je silazno sortiranje. Računalno sortiranje je posebno učinkovito kada je raspon ulaznih elemenata poznat i relativno mali. To eliminira potrebu za usporedbom elemenata, glavnom dugotrajnom operacijom u mnogim drugim algoritmima sortiranja. Korištenjem znanja o ulaznoj domeni, računalno sortiranje postiže linearnu vremensku složenost. Numeričko sortiranje prvo skenira ulazni niz kako bi se odredio broj svakog elementa. Zatim koristi te brojeve za izračunavanje točnih pozicija elemenata u poredanoj tablici rezultata. Algoritam se sastoji od sljedećih koraka:
- Da biste odredili raspon, odredite minimalnu i maksimalnu vrijednost ulaznog polja.
- Napravite radni list inicijaliziran veličinom raspona i nulama.
- Iterirajte preko ulaznog polja i povećajte svaki pronađeni element.
- Izmijenite radni list izračunavanjem kumulativnog ukupnog iznosa kako biste dobili točne pozicije za svaki element.
- Stvorite izlazni niz iste veličine kao ulazni niz.
- Ponovno pomaknite ulazni niz, postavljajući svaki element na ispravnu poziciju u izlaznom nizu na temelju radnog lista.
- Tablica rezultata sada sadrži sortirane elemente.
Glavna prednost padajućeg sortiranja je da postiže linearnu vremensku složenost od O(n), što ga čini vrlo učinkovitim za velike ulazne veličine. Međutim, njegova je primjenjivost ograničena na scenarije u kojima je izbor ulaznih elemenata unaprijed poznat i relativno mali.
Važno je napomenuti da drugi algoritmi sortiranja, poput brzog sortiranja ili spajanja, obično imaju vremensku složenost od O(n log n), što se smatra učinkovitim za mnoge praktične primjene. Algoritmi linearnog vremenskog sortiranja, kao što je numeričko sortiranje, pružaju alternativu kada određena ograničenja ili svojstva ulaza dopuštaju korištenje linearne vremenske složenosti.
Povijest
Algoritmi za linearno sortiranje vremena imaju bogatu povijest u računalnoj znanosti. Razvoj linearnog vremenskog poretka može se pratiti do sredine 20. stoljeća, a doprinosi znanstvenika i matematičara bili su značajni. Jedan od najranijih algoritama linearnog vremenskog sortiranja je bucket sort, koji je predložio Harold H. Seward 1954. Bucket sortiranje dijeli ulazne elemente u konačan broj žica i zatim razvrstava svaku skupinu zasebno. Ovaj algoritam ima linearnu vremensku složenost ako je distribucija ulaznih elemenata relativno jednolika.
Godine 1959. Kenneth E. Iverson predstavio je radix algoritam koji postiže linearnu vremensku složenost. Radix razvrstava elemente prema njihovim brojevima ili predznacima od najmanje značajnog do najvažnijeg. Koristi robusne algoritme za sortiranje, kao što je numeričko sortiranje ili sortiranje po segmentima, za sortiranje elemenata na svakoj lokaciji znamenke. Radix sortiranje postalo je popularno u eri bušenih kartica i ranih računalnih sustava. Međutim, najpoznatiji algoritam za linearno vremensko sortiranje je enumeracija, koji su uveli Harold H. Seward i Peter Elias 1954. godine, a kasnije ga je neovisno ponovno otkrio Harold H. 'Bobby' Johnson 1961. godine. Numeričko sortiranje je dobilo značajnu pozornost.
najljepši osmijeh na svijetu
Ovo je posebno učinkovito kada je raspon ulaznih elemenata poznat i relativno mali. Povijest linearnog sortiranja vremena nastavila se s razvojem drugih specijaliziranih algoritama. Na primjer, 1987. Hanan Samet predložio je binarno distribucijsko sortiranje stabla, linearni algoritam vremenskog sortiranja za višedimenzionalne podatke. Tijekom godina istraživači su nastavili proučavati i poboljšavati algoritme linearnog raspoređivanja, fokusirajući se na specifične scenarije i ograničenja. Iako se algoritmi poput brzog sortiranja i spajanja šire koriste zbog svoje učinkovitosti u više scenarija, algoritmi linearnog vremenskog sortiranja pružaju vrijedne alternative kada određene okolnosti dopuštaju iskorištavanje složenosti linearnog vremena. Općenito, povijest linearnog vremenskog sortiranja karakterizira potraga za učinkovitim algoritmima koji mogu sortirati velike skupove podataka u linearnom vremenu, nadilazeći ograničenja algoritama sortiranja temeljenih na usporedbi. Doprinosi raznih istraživača utrli su put razvoju i razumijevanju ovih specijaliziranih tehnika sortiranja.
Vrste linearnog sortiranja vremena
Postoji nekoliko različitih algoritama za linearno vremensko sortiranje. Dvije glavne vrste su algoritmi temeljeni na brojanju i algoritmi temeljeni na radixu. Ovo su najčešći algoritmi linearnog vremenskog razvrstavanja, klasificirani na temelju sljedećih vrsta:
Algoritmi temeljeni na brojanju
Algoritmi temeljeni na Radixu
Prednosti linearnog sortiranja vremena
Algoritmi linearnog vremenskog sortiranja, kao što je numeričko sortiranje, nude nekoliko prednosti u određenim scenarijima.
Nedostaci linearnog sortiranja vremena
Iako linearni algoritmi raspoređivanja imaju svoje prednosti, oni također imaju određena ograničenja i nedostatke:
Prilikom odabira algoritma sortiranja bitno je pažljivo razmotriti specifičnosti ulaznih podataka i zahtjeve problema sortiranja. Iako linearni algoritmi raspoređivanja nude prednosti u određenim scenarijima, oni su samo ponekad najprikladniji ili najučinkovitiji izbor.
Primjene algoritama za linearno vremensko sortiranje
Algoritmi linearnog vremenskog razvrstavanja su učinkoviti i imaju mnoge primjene u raznim područjima. Evo nekoliko tipičnih primjena linearnog vremenskog poretka:
Implementacija linearnog vremenskog sortiranja u C++
Evo primjera programa koji implementira Counting Sort, što je algoritam linearnog vremenskog sortiranja:
#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();>
Ovo označava da je ulazni niz sortiran uzlaznim redoslijedom pomoću algoritma Sortiranja brojanjem, što je rezultiralo sortiranim nizom [1, 2, 2, 3, 3, 4, 8].
U ovom C++ programu, funkcija sortiranja brojanjem uzima referencu na vektor arr i pokreće rutinu sortiranja brojanjem. Pronalazi maksimalnu vrijednost tablice za određivanje veličine radnog lista. Zatim broji pojavljivanje svakog elementa i izračunava zbroj prefiksa radnog lista. Zatim stvara vektor rezultata i stavlja elemente u red prema radnom listu. Na kraju kopira sortirane elemente natrag u izvorni niz. U primarnoj funkciji, primjer niza {4, 2, 2, 8, 3, 3, 1} sortiran je algoritmom za sortiranje nabrajanjem i ispisan kao sortirana matrica. Imajte na umu da program koristi biblioteke za rad s vektorima i pronalaženje maksimalnog elementa niza pomoću funkcije max_element.