Vad är räknesortering?
Räknesortering är en icke-jämförelsebaserad sorteringsalgoritm som fungerar bra när det finns begränsat antal indatavärden. Det är särskilt effektivt när intervallet av ingångsvärden är litet jämfört med antalet element som ska sorteras. Grundtanken bakom Räknesortering är att räkna frekvens av varje distinkt element i inmatningsmatrisen och använd den informationen för att placera elementen i deras korrekt sorterade positioner.
Hur fungerar Counting Sort Algorithm?
Steg 1 :
- Ta reda på maximal element från den givna arrayen.
Steg 2:
- Initiera a countArray[] av längd max+1 med alla element som 0 . Denna matris kommer att användas för att lagra förekomsterna av elementen i inmatningsmatrisen.
Steg 3:
- I den countArray[] lagrar antalet för varje unikt element i inmatningsmatrisen vid deras respektive index.
- Till exempel: Antalet element 2 i inmatningsmatrisen är 2. Så, butik 2 vid index 2 i countArray[] . På samma sätt, antalet element 5 i inmatningsmatrisen är 1 , därav butik 1 vid index 5 i countArray[] .
Steg 4:
- Förvara kumulativ summa eller prefix summa av elementen i countArray[] genom att göra countArray[i] = countArray[i – 1] + countArray[i]. Detta kommer att hjälpa till att placera elementen i inmatningsmatrisen vid rätt index i utmatrisen.
Steg 5:
- Iterera från änden av inmatningsmatrisen och eftersom korsning av inmatningsmatrisen från änden bevarar ordningen av lika element, vilket så småningom gör denna sorteringsalgoritm stabil .
- Uppdatering outputArray[ countArray[ inputArray[i] ] – 1] = inputArray[i] .
- Uppdatera också countArray[ inputArray[i] ] = countArray[ inputArray[i] ] – -.
Steg 6: För i = 6 ,
skal sortera
Uppdatering outputArray[ countArray[ inputArray[6] ] – 1] = inputArray[6]
Uppdatera också countArray[ inputArray[6] ] = countArray[ inputArray[6] ]- –
Steg 7: För i = 5 ,
Uppdatering outputArray[ countArray[ inputArray[5] ] – 1] = inputArray[5]
Uppdatera också countArray[ inputArray[5] ] = countArray[ inputArray[5] ]- –
Steg 8: För i = 4 ,
Uppdatering outputArray[ countArray[ inputArray[4] ] – 1] = inputArray[4]
Uppdatera också countArray[ inputArray[4] ] = countArray[ inputArray[4] ]- –
Steg 9: För i = 3 ,
Uppdatering outputArray[ countArray[ inputArray[3] ] – 1] = inputArray[3]
Uppdatera också countArray[ inputArray[3] ] = countArray[ inputArray[3] ]- –
Steg 10: För i = 2 ,
Uppdatering outputArray[ countArray[ inputArray[2] ] – 1] = inputArray[2]
Uppdatera också countArray[ inputArray[2] ] = countArray[ inputArray[2] ]- –
Steg 11: För i = 1 ,
Uppdatering outputArray[ countArray[ inputArray[1] ] – 1] = inputArray[1]
Uppdatera också countArray[ inputArray[1] ] = countArray[ inputArray[1] ]- –
Steg 12: För i = 0,
Uppdatering outputArray[ countArray[ inputArray[0] ] – 1] = inputArray[0]
Uppdatera också countArray[ inputArray[0] ] = countArray[ inputArray[0] ]- –
Räknesorteringsalgoritm:
- Deklarera en extra array countArray[] av storlek max(inputArray[])+1 och initiera den med 0 .
- Traverse array inputArray[] och kartlägga varje element av inputArray[] som ett index på countArray[] array, dvs exekvera countArray[inputArray[i]]++ för 0 <= i < N .
- Beräkna prefixsumman vid varje index av array inputArray [].
- Skapa en array outputArray[] av storlek N .
- Traverse array inputArray[] från slutet och uppdatera outputArray[ countArray[ inputArray[i] ] – 1] = inputArray[i] . Uppdatera också countArray[ inputArray[i] ] = countArray[ inputArray[i] ]- – .
Nedan är implementeringen av ovanstående algoritm:
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--) { outputArray[countArray[inputArray[i]] - 1] = inputArray[i]; countArray[inputArray[i]]--; } returnera 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(List<> 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--) { outputArray[countArray[inputArray[i]] - 1] = inputArray[i]; countArray[inputArray[i]]--; } returnera outputArray; } // Drivrutinskod const inputArray = [4, 3, 12, 1, 5, 5, 3, 9]; // Sortering av inmatningsmatrisen const outputArray = countSort(inputArray); // Skriver ut den sorterade arrayen console.log(outputArray.join(' ')); //Denna kod bidrar med Utkarsh> |
cdr full form
>
>
C++14
#include> using> namespace> std;> vector<> int> >countSort(vektor<> 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> => ' '> )> |
>
>Produktion
1 3 3 4 5 5 9 12>
Komplexitetsanalys av räkneslag:
- Tidskomplexitet : O(N+M), där N och M är storleken på inputArray[] och countArray[] respektive.
- Värsta fall: O(N+M).
- Medel-case: O(N+M).
- Bästa fall: O(N+M).
- Hjälputrymme: O(N+M), där N och M är utrymmet som tas av outputArray[] och countArray[] respektive.
Fördel med räknesortering:
- Räknesortering fungerar generellt snabbare än alla jämförelsebaserade sorteringsalgoritmer, såsom sammanslagningssortering och snabbsortering, om indataområdet är i storleksordningen av antalet indata.
- Räkna sortering är lätt att koda
- Räkna sort är en stabil algoritm .
Nackdelen med räknesortering:
- Att räkna sortering fungerar inte på decimalvärden.
- Att räkna sortering är ineffektivt om intervallet av värden som ska sorteras är mycket stort.
- Att räkna sort är inte en Sortering på plats algoritm, Den använder extra utrymme för att sortera arrayelementen.