Introduktion
Sortering är en viktig operation inom datavetenskap som innebär att element ordnas i en specifik ordning, till exempel numerisk eller alfabetisk ordning. Olika sorteringsalgoritmer har utvecklats, var och en med tids- och effektivitetsindikatorer. Linjär tidssortering är en undergrupp av sorteringsalgoritmer med en betydande fördel: de kan sortera en given uppsättning element i linjär tid, körtiden ökar linjärt med indatastorleken.
Den mest kända linjära tidssorteringsalgoritmen är fallande sortering. Beräkningssortering är särskilt effektiv när utbudet av inmatningselement är känt och relativt litet. Detta eliminerar behovet av att jämföra element, den huvudsakliga tidskrävande operationen i många andra sorteringsalgoritmer. Med hjälp av kunskap om input-domän uppnår beräkningssortering linjär tidskomplexitet. En numerisk sortering skannar först inmatningsmatrisen för att bestämma antalet för varje element. Den använder sedan dessa siffror för att beräkna de korrekta positionerna för elementen i den ordnade resultattabellen. Algoritmen består av följande steg:
- För att bestämma intervallet, identifiera minimi- och maximivärdena för inmatningsmatrisen.
- Skapa ett kalkylblad initierat med intervallstorleken och nollor.
- Iterera över inmatningsmatrisen och inkrementera varje hittat element.
- Ändra kalkylbladet genom att beräkna den ackumulerade summan för att få rätt positioner för varje element.
- Skapa en utmatris med samma storlek som inmatningsmatrisen.
- Flytta inmatningsmatrisen igen, placera varje element i rätt position i utmatrisen baserat på kalkylbladet.
- Resultattabellen innehåller nu sorterade element.
Den största fördelen med fallande sortering är att den uppnår en linjär tidskomplexitet på O(n), vilket gör den mycket effektiv för stora indatastorlekar. Dess tillämpbarhet är dock begränsad till scenarier där valet av insatselement är känt i förväg och relativt litet.
Det är viktigt att notera att andra sorteringsalgoritmer, såsom quicksort eller merge, vanligtvis har en tidskomplexitet på O(n log n), vilket anses vara effektivt för många praktiska tillämpningar. Linjära tidssorteringsalgoritmer, såsom numerisk sortering, tillhandahåller ett alternativ när vissa begränsningar eller egenskaper hos inmatningen tillåter linjär tidskomplexitet att användas.
Historia
Linjära tidssorteringsalgoritmer har en rik historia inom datavetenskap. Utvecklingen av linjär tidsordning kan spåras tillbaka till mitten av 1900-talet, och bidragen från vetenskapsmän och matematiker var betydande. En av de tidigaste linjära tidssorteringsalgoritmerna är hinksortering, föreslog av Harold H. Seward 1954. En hinksortering delar in inmatningselementen i ett ändligt antal hinkar och sorterar sedan varje hink separat. Denna algoritm har linjär tidskomplexitet om fördelningen av ingångselement är relativt enhetlig.
1959 introducerade Kenneth E. Iverson en radixalgoritm som uppnår linjär tidskomplexitet. Radix sorterar element efter deras antal eller tecken från minst signifikant till mest signifikant. Den använder robusta sorteringsalgoritmer, såsom numerisk eller hinksortering, för att sortera elementen på varje siffra. Radixsortering blev populärt under hålkortens och tidiga datorsystems era. Den mest kända linjära tidssorteringsalgoritmen är dock en uppräkning, introducerad av Harold H. Seward och Peter Elias 1954 och senare återupptäckt oberoende av Harold H. 'Bobby' Johnson 1961. Numerisk sortering har fått stor uppmärksamhet.
Detta är särskilt effektivt när omfånget av ingångselement är känt och relativt litet. Historien om linjär tidssortering fortsatte med utvecklingen av andra specialiserade algoritmer. Till exempel, 1987, föreslog Hanan Samet binär distributionsträdsortering, en linjär tidssorteringsalgoritm för flerdimensionell data. Under åren har forskare fortsatt att studera och förbättra linjära schemaläggningsalgoritmer, med fokus på specifika scenarier och begränsningar. Även om algoritmer som quicksort och merge används mer allmänt för sin effektivitet i fler scenarier, ger linjärtidssorteringsalgoritmer värdefulla alternativ när vissa omständigheter tillåter att linjärtidskomplexiteten kan utnyttjas. I allmänhet kännetecknas historien av linjär tidssortering av att söka efter effektiva algoritmer som kan sortera stora datamängder i linjär tid, och övervinna begränsningarna hos jämförelsebaserade sorteringsalgoritmer. Bidragen från olika forskare banade väg för att utveckla och förstå dessa specialiserade sorteringstekniker.
Typer av linjär tidssortering
Det finns flera olika linjära tidssorteringsalgoritmer. De två huvudtyperna är räkningsbaserade algoritmer och radixbaserade algoritmer. Här är de vanligaste linjära tidssorteringsalgoritmerna, klassificerade utifrån följande typer:
Räknebaserade algoritmer
Radix-baserade algoritmer
Fördelar med linjär tidssortering
Linjära tidssorteringsalgoritmer, såsom numerisk sortering, erbjuder flera fördelar i specifika scenarier.
Nackdelar med linjär tidssortering
Även om linjära schemaläggningsalgoritmer har sina fördelar, har de också vissa begränsningar och nackdelar:
När du väljer en sorteringsalgoritm är det viktigt att noggrant överväga indatas specifikationer och sorteringsproblemets krav. Även om linjära schemaläggningsalgoritmer erbjuder fördelar i specifika scenarier, är de bara ibland det mest lämpliga eller effektiva valet.
Tillämpningar av linjära tidssorteringsalgoritmer
Linjära tidssorteringsalgoritmer är effektiva och har många tillämpningar inom olika områden. Här är några typiska tillämpningar av linjär tidsordning:
Implementering av linjär tidssortering i C++
Här är ett exempel på ett program som implementerar Counting Sort, som är en linjär tidssorteringsalgoritm:
#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();>
Detta indikerar att inmatningsmatrisen har sorterats i stigande ordning med hjälp av Counting Sort-algoritmen, vilket resulterar i den sorterade matrisen [1, 2, 2, 3, 3, 4, 8].
I detta C++-program tar räknesorteringsfunktionen en referens till vektorn arr och kör räknesorteringsrutinen. Den hittar tabellens maximala värde för att bestämma kalkylbladets storlek. Den räknar sedan varje elements förekomst och beräknar kalkylbladets prefixsumma. Sedan skapar den en resultatvektor och placerar elementen i ordning enligt kalkylbladet. Slutligen kopierar den de sorterade elementen tillbaka till den ursprungliga arrayen. I den primära funktionen sorteras exempelmatrisen {4, 2, 2, 8, 3, 3, 1} av uppräkningssorteringsalgoritmen och skrivs ut som en sorterad matris. Observera att programmet använder bibliotek för att arbeta med vektorer och hitta det maximala elementet i en array med funktionen max_element.