Einführung
Sortieren ist ein wesentlicher Vorgang in der Informatik, bei dem Elemente in einer bestimmten Reihenfolge angeordnet werden, beispielsweise in numerischer oder alphabetischer Reihenfolge. Es wurden verschiedene Sortieralgorithmen entwickelt, jeweils mit Zeit- und Effizienzindikatoren. Die lineare Zeitsortierung ist eine Teilmenge der Sortieralgorithmen mit einem erheblichen Vorteil: Sie können eine bestimmte Menge von Elementen in linearer Zeit sortieren, die Laufzeit steigt linear mit der Eingabegröße.
Der bekannteste lineare Zeitsortieralgorithmus ist die absteigende Sortierung. Die rechnerische Sortierung ist besonders effizient, wenn der Bereich der Eingabeelemente bekannt und relativ klein ist. Dadurch entfällt die Notwendigkeit, Elemente zu vergleichen, was bei vielen anderen Sortieralgorithmen der zeitaufwändigste Vorgang ist. Unter Verwendung von Eingabedomänenwissen erreicht die rechnerische Sortierung eine lineare Zeitkomplexität. Bei einer numerischen Sortierung wird zunächst das Eingabearray durchsucht, um die Anzahl jedes Elements zu ermitteln. Anschließend werden diese Zahlen verwendet, um die korrekten Positionen der Elemente in der geordneten Ergebnistabelle zu berechnen. Der Algorithmus besteht aus den folgenden Schritten:
- Um den Bereich zu bestimmen, identifizieren Sie die minimalen und maximalen Werte des Eingabearrays.
- Erstellen Sie ein Arbeitsblatt, das mit der Bereichsgröße und Nullen initialisiert ist.
- Durchlaufen Sie das Eingabearray und erhöhen Sie jedes gefundene Element.
- Ändern Sie das Arbeitsblatt, indem Sie die kumulative Summe berechnen, um die richtigen Positionen für jedes Element zu erhalten.
- Erstellen Sie ein Ausgabearray mit der gleichen Größe wie das Eingabearray.
- Verschieben Sie das Eingabearray erneut und platzieren Sie jedes Element basierend auf dem Arbeitsblatt an der richtigen Position im Ausgabearray.
- Die Ergebnistabelle enthält nun sortierte Elemente.
Der Hauptvorteil der absteigenden Sortierung besteht darin, dass sie eine lineare Zeitkomplexität von O(n) erreicht, was sie für große Eingabegrößen sehr effizient macht. Allerdings ist seine Anwendbarkeit auf Szenarien beschränkt, in denen die Auswahl an Eingabeelementen im Voraus bekannt und relativ gering ist.
Es ist wichtig zu beachten, dass andere Sortieralgorithmen wie Quicksort oder Merge typischerweise eine zeitliche Komplexität von O(n log n) haben, was für viele praktische Anwendungen als effizient gilt. Algorithmen zur linearen Zeitsortierung, wie beispielsweise die numerische Sortierung, bieten eine Alternative, wenn bestimmte Einschränkungen oder Eigenschaften der Eingabe die Verwendung linearer Zeitkomplexität zulassen.
Geschichte
Lineare Zeitsortierungsalgorithmen haben in der Informatik eine lange Geschichte. Die Entwicklung der linearen Zeitordnung lässt sich bis in die Mitte des 20. Jahrhunderts zurückverfolgen, und die Beiträge von Wissenschaftlern und Mathematikern waren bedeutend. Einer der frühesten linearen Zeitsortierungsalgorithmen ist die Bucket-Sortierung, die 1954 von Harold H. Seward vorgeschlagen wurde. Eine Bucket-Sortierung unterteilt die Eingabeelemente in eine endliche Anzahl von Buckets und sortiert dann jeden Bucket separat. Dieser Algorithmus hat eine lineare Zeitkomplexität, wenn die Verteilung der Eingabeelemente relativ gleichmäßig ist.
Im Jahr 1959 führte Kenneth E. Iverson einen Basisalgorithmus ein, der eine lineare Zeitkomplexität erreicht. Radix sortiert Elemente nach ihrer Zahl oder ihrem Vorzeichen von der niedrigsten zur höchsten Signifikanz. Es verwendet robuste Sortieralgorithmen wie numerische Sortierung oder Bucket-Sortierung, um die Elemente an jeder Ziffernposition zu sortieren. Die Radix-Sortierung wurde im Zeitalter der Lochkarten und der frühen Computersysteme populär. Der bekannteste lineare Zeitsortierungsalgorithmus ist jedoch eine Aufzählung, die 1954 von Harold H. Seward und Peter Elias eingeführt und später 1961 von Harold H. „Bobby“ Johnson unabhängig wiederentdeckt wurde. Die numerische Sortierung hat große Aufmerksamkeit erhalten.
Dies ist besonders effektiv, wenn der Bereich der Eingabeelemente bekannt und relativ klein ist. Die Geschichte der linearen Zeitsortierung wurde mit der Entwicklung anderer spezialisierter Algorithmen fortgesetzt. Beispielsweise schlug Hanan Samet 1987 die binäre Verteilungsbaumsortierung vor, einen linearen Zeitsortieralgorithmus für mehrdimensionale Daten. Im Laufe der Jahre haben Forscher weiterhin lineare Planungsalgorithmen untersucht und verbessert und sich dabei auf bestimmte Szenarien und Einschränkungen konzentriert. Obwohl Algorithmen wie Quicksort und Merge aufgrund ihrer Effizienz in mehr Szenarien häufiger eingesetzt werden, bieten lineare Zeitsortieralgorithmen wertvolle Alternativen, wenn bestimmte Umstände die Ausnutzung der linearen Zeitkomplexität ermöglichen. Im Allgemeinen ist die Geschichte der linearen Zeitsortierung durch die Suche nach effizienten Algorithmen gekennzeichnet, die große Datensätze in linearer Zeit sortieren können und dabei die Einschränkungen vergleichsbasierter Sortieralgorithmen überwinden. Die Beiträge verschiedener Forscher ebneten den Weg für die Entwicklung und das Verständnis dieser speziellen Sortiertechniken.
Arten der linearen Zeitsortierung
Es gibt verschiedene lineare Zeitsortierungsalgorithmen. Die beiden Haupttypen sind zählbasierte Algorithmen und radixbasierte Algorithmen. Hier sind die gängigsten linearen Zeitsortierungsalgorithmen, klassifiziert nach den folgenden Typen:
Zählbasierte Algorithmen
Radixbasierte Algorithmen
Vorteile der linearen Zeitsortierung
Lineare Zeitsortierungsalgorithmen, wie beispielsweise die numerische Sortierung, bieten in bestimmten Szenarien mehrere Vorteile.
Nachteile der linearen Zeitsortierung
Obwohl lineare Planungsalgorithmen ihre Vorteile haben, weisen sie auch bestimmte Einschränkungen und Nachteile auf:
Bei der Auswahl eines Sortieralgorithmus ist es wichtig, die Besonderheiten der Eingabedaten und die Anforderungen des Sortierproblems sorgfältig zu berücksichtigen. Obwohl lineare Planungsalgorithmen in bestimmten Szenarien Vorteile bieten, sind sie nur manchmal die geeignetste oder effizienteste Wahl.
Anwendungen linearer Zeitsortierungsalgorithmen
Lineare Zeitsortierungsalgorithmen sind effizient und haben viele Anwendungen in verschiedenen Bereichen. Hier sind einige typische Anwendungen der linearen Zeitordnung:
Implementierung der linearen Zeitsortierung in C++
Hier ist ein Beispiel für ein Programm, das Counting Sort implementiert, einen linearen Zeitsortierungsalgorithmus:
#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();>
Dies zeigt an, dass das Eingabearray mit dem Counting Sort-Algorithmus in aufsteigender Reihenfolge sortiert wurde, was zum sortierten Array [1, 2, 2, 3, 3, 4, 8] führt.
In diesem C++-Programm nimmt die Counting-Sort-Funktion einen Verweis auf den Vektor arr und führt die Counting-Sort-Routine aus. Es ermittelt den Maximalwert der Tabelle, um die Größe des Arbeitsblatts zu bestimmen. Anschließend wird das Vorkommen jedes Elements gezählt und die Präfixsumme des Arbeitsblatts berechnet. Anschließend wird ein Ergebnisvektor erstellt und die Elemente entsprechend dem Arbeitsblatt geordnet. Schließlich kopiert es die sortierten Elemente zurück in das ursprüngliche Array. In der Primärfunktion wird das Beispielarray {4, 2, 2, 8, 3, 3, 1} durch den Aufzählungssortieralgorithmus sortiert und als sortierte Matrix ausgegeben. Beachten Sie, dass das Programm Bibliotheken verwendet, um mit Vektoren zu arbeiten und mithilfe der Funktion max_element das maximale Element eines Arrays zu finden.