Was ist Zählsortierung?
Zählsortierung ist ein nicht vergleichsbasiert Sortieralgorithmus, der gut funktioniert, wenn der Bereich der Eingabewerte begrenzt ist. Dies ist besonders effizient, wenn der Bereich der Eingabewerte im Vergleich zur Anzahl der zu sortierenden Elemente klein ist. Die Grundidee dahinter Zählsortierung ist das zu zählen Frequenz jedes einzelnen Elements im Eingabearray und verwenden Sie diese Informationen, um die Elemente an ihren korrekten sortierten Positionen zu platzieren.
Wie funktioniert der Zählsortieralgorithmus?
Schritt 1 :
- Finden Sie es heraus maximal Element aus dem angegebenen Array.
Schritt 2:
- Initialisieren Sie a countArray[] der Länge max+1 mit allen Elementen als 0 . Dieses Array wird zum Speichern der Vorkommen der Elemente des Eingabearrays verwendet.
Schritt 3:
- Im countArray[] Speichern Sie die Anzahl jedes eindeutigen Elements des Eingabearrays in den jeweiligen Indizes.
- Zum Beispiel: Die Anzahl der Elemente 2 im Eingabearray ist 2. Also, speichern 2 am Index 2 im countArray[] . Ebenso die Anzahl der Elemente 5 im Eingabearray ist 1 , daher speichern 1 am Index 5 im countArray[] .
Schritt 4:
- Speichern Sie die kumulierte Summe oder Präfixsumme der Elemente der countArray[] indem man es tut countArray[i] = countArray[i – 1] + countArray[i]. Dies hilft dabei, die Elemente des Eingabearrays am richtigen Index im Ausgabearray zu platzieren.
Schritt 5:
- Iterieren Sie vom Ende des Eingabearrays und da beim Durchlaufen des Eingabearrays vom Ende aus die Reihenfolge gleicher Elemente erhalten bleibt, ergibt sich letztendlich dieser Sortieralgorithmus stabil .
- Aktualisieren OutputArray[ countArray[ InputArray[i] ] – 1] = InputArray[i] .
- Außerdem aktualisieren countArray[ inputArray[i] ] = countArray[ inputArray[i] ] – -.
Schritt 6: Für i = 6 ,
jdbc jdbc
Aktualisieren OutputArray[ countArray[ InputArray[6] ] – 1] = InputArray[6]
Außerdem aktualisieren countArray[ inputArray[6] ] = countArray[ inputArray[6] ]- –
Schritt 7: Für i = 5 ,
Aktualisieren OutputArray[ countArray[ InputArray[5] ] – 1] = InputArray[5]
Außerdem aktualisieren countArray[ inputArray[5] ] = countArray[ inputArray[5] ]- –
Schritt 8: Für i = 4 ,
Aktualisieren OutputArray[ countArray[ InputArray[4] ] – 1] = InputArray[4]
Außerdem aktualisieren countArray[ inputArray[4] ] = countArray[ inputArray[4] ]- –
Schritt 9: Für i = 3 ,
Aktualisieren OutputArray[ countArray[ InputArray[3] ] – 1] = InputArray[3]
Außerdem aktualisieren countArray[ inputArray[3] ] = countArray[ inputArray[3] ]- –
Schritt 10: Für i = 2 ,
Aktualisieren OutputArray[ countArray[ InputArray[2] ] – 1] = InputArray[2]
Außerdem aktualisieren countArray[ inputArray[2] ] = countArray[ inputArray[2] ]- –
Schritt 11: Für i = 1 ,
Aktualisieren OutputArray[ countArray[ InputArray[1] ] – 1] = InputArray[1]
Außerdem aktualisieren countArray[ inputArray[1] ] = countArray[ inputArray[1] ]- –
Schritt 12: Für i = 0,
Aktualisieren OutputArray[ countArray[ InputArray[0] ] – 1] = InputArray[0]
Außerdem aktualisieren countArray[ inputArray[0] ] = countArray[ inputArray[0] ]- –
Zählsortieralgorithmus:
- Deklarieren Sie ein Hilfsarray countArray[] der Größe max(inputArray[])+1 und initialisiere es mit 0 .
- Array durchqueren EingabeArray[] und ordne jedes Element von zu EingabeArray[] als Index von countArray[] Array, d. h. ausführen countArray[inputArray[i]]++ für 0 <= i < N .
- Berechnen Sie die Präfixsumme an jedem Index des Arrays EingabeArray [].
- Erstellen Sie ein Array AusgabeArray[] der Größe N .
- Array durchqueren EingabeArray[] vom Ende und Update OutputArray[ countArray[ InputArray[i] ] – 1] = InputArray[i] . Außerdem aktualisieren countArray[ inputArray[i] ] = countArray[ inputArray[i] ]- – .
Unten ist die Implementierung des obigen Algorithmus:
Java
import> java.util.Arrays;> public> class> CountSort {> > public> static> int> [] countSort(> int> [] inputArray) {> > int> N = inputArray.length;> > int> M => 0> ;> > for> (> int> i => 0> ; i M = Math.max(M, inputArray[i]); } int[] countArray = new int[M + 1]; for (int i = 0; i countArray[inputArray[i]]++; } for (int i = 1; i <= M; i++) { countArray[i] += countArray[i - 1]; } int[] outputArray = new int[N]; for (int i = N - 1; i>= 0; i--) { inputArray[countArray[inputArray[i]] - 1] = inputArray[i]; countArray[inputArray[i]]--; } return OutputArray; } public static void main(String[] args) { int[] inputArray = {4, 3, 12, 1, 5, 5, 3, 9}; int[]outputArray = countSort(inputArray); for (int i = 0; i System.out.print(outputArray[i] + ' '); } } }> |
>
>
C#
using> System;> using> System.Collections.Generic;> class> GFG> {> > static> List<> int> >CountSort(Liste<> int> >inputArray)> > {> > int> N = inputArray.Count;> > // Finding the maximum element of the array inputArray[].> > int> M = 0;> > for> (> int> i = 0; i M = Math.Max(M, inputArray[i]); // Initializing countArray[] with 0 List |
>
>
Javascript
function> countSort(inputArray) {> > const N = inputArray.length;> > // Finding the maximum element of inputArray> > let M = 0;> > for> (let i = 0; i M = Math.max(M, inputArray[i]); } // Initializing countArray with 0 const countArray = new Array(M + 1).fill(0); // Mapping each element of inputArray as an index of countArray for (let i = 0; i countArray[inputArray[i]]++; } // Calculating prefix sum at every index of countArray for (let i = 1; i <= M; i++) { countArray[i] += countArray[i - 1]; } // Creating outputArray from countArray const outputArray = new Array(N); for (let i = N - 1; i>= 0; i--) { inputArray[countArray[inputArray[i]] - 1] = inputArray[i]; countArray[inputArray[i]]--; } return OutputArray; } // Treibercode const inputArray = [4, 3, 12, 1, 5, 5, 3, 9]; // Sortieren des Eingabearrays const outputArray = countSort(inputArray); // Drucken des sortierten Arrays console.log(outputArray.join(' ')); //Dieser Code wurde von Utkarsh beigesteuert> |
So wählen Sie Spalten aus verschiedenen Tabellen in SQL aus
>
>
C++14
#include> using> namespace> std;> vector<> int> >countSort(vector<> int> >& inputArray)> {> > int> N = inputArray.size();> > // Finding the maximum element of array inputArray[].> > int> M = 0;> > for> (> int> i = 0; i M = max(M, inputArray[i]); // Initializing countArray[] with 0 vector |
>
>
Python3
def> count_sort(input_array):> > # Finding the maximum element of input_array.> > M> => max> (input_array)> > # Initializing count_array with 0> > count_array> => [> 0> ]> *> (M> +> 1> )> > # Mapping each element of input_array as an index of count_array> > for> num> in> input_array:> > count_array[num]> +> => 1> > # Calculating prefix sum at every index of count_array> > for> i> in> range> (> 1> , M> +> 1> ):> > count_array[i]> +> => count_array[i> -> 1> ]> > # Creating output_array from count_array> > output_array> => [> 0> ]> *> len> (input_array)> > for> i> in> range> (> len> (input_array)> -> 1> ,> -> 1> ,> -> 1> ):> > output_array[count_array[input_array[i]]> -> 1> ]> => input_array[i]> > count_array[input_array[i]]> -> => 1> > return> output_array> # Driver code> if> __name__> => => '__main__'> :> > # Input array> > input_array> => [> 4> ,> 3> ,> 12> ,> 1> ,> 5> ,> 5> ,> 3> ,> 9> ]> > # Output array> > output_array> => count_sort(input_array)> > for> num> in> output_array:> > print> (num, end> => ' '> )> |
>
>Ausgabe
1 3 3 4 5 5 9 12>
Komplexitätsanalyse der Zählsortierung:
- Zeitkomplexität : O(N+M), wo N Und M sind die Größe von EingabeArray[] Und countArray[] jeweils.
- Im schlimmsten Fall: O(N+M).
- Durchschnittsfall: O(N+M).
- Bester Fall: O(N+M).
- Hilfsraum: O(N+M), wo N Und M sind der Platz, der von eingenommen wird AusgabeArray[] Und countArray[] jeweils.
Vorteil der Zählsortierung:
- Zählsortierung ist im Allgemeinen schneller als alle vergleichsbasierten Sortieralgorithmen, wie z. B. Zusammenführungssortierung und Schnellsortierung, wenn der Eingabebereich in der Größenordnung der Anzahl der Eingaben liegt.
- Die Zählsortierung ist einfach zu codieren
- Zählsortierung ist eine stabiler Algorithmus .
Nachteil der Zählsortierung:
- Die Zählsortierung funktioniert nicht bei Dezimalwerten.
- Die Zählsortierung ist ineffizient, wenn der zu sortierende Wertebereich sehr groß ist.
- Zählsortierung ist keine Sortieren vor Ort Algorithmus. Er verwendet zusätzlichen Platz zum Sortieren der Array-Elemente.