Čo je triedenie počítania?
Počítanie Triediť je a nezaložené na porovnávaní triediaci algoritmus, ktorý funguje dobre, keď je obmedzený rozsah vstupných hodnôt. Je to obzvlášť efektívne, keď je rozsah vstupných hodnôt malý v porovnaní s počtom prvkov, ktoré sa majú triediť. Základná myšlienka Počítanie Triediť je počítať frekvencia každého odlišného prvku vo vstupnom poli a použiť tieto informácie na umiestnenie prvkov na ich správne zoradené pozície.
Ako funguje algoritmus triedenia počítania?
Krok 1 :
- Zistite si maximálne prvok z daného poľa.
Krok 2:
- Inicializovať a countArray[] dĺžky max+1 so všetkými prvkami ako 0 . Toto pole sa použije na ukladanie výskytov prvkov vstupného poľa.
Krok 3:
- V countArray[] , uložte počet každého jedinečného prvku vstupného poľa v ich príslušných indexoch.
- Napríklad: Počet prvkov 2 vo vstupnom poli je 2. Takže skladujte 2 pri indexe 2 v countArray[] . Podobne aj počet prvkov 5 vo vstupnom poli je 1 , teda obchod 1 pri indexe 5 v countArray[] .
Krok 4:
- Uložte kumulatívna suma alebo súčet predpony z prvkov countArray[] vykonávaním countArray[i] = countArray[i – 1] + countArray[i]. To pomôže umiestniť prvky vstupného poľa na správny index vo výstupnom poli.
Krok 5:
- Iterujte od konca vstupného poľa a pretože prechádzanie vstupným poľom od konca zachováva poradie rovnakých prvkov, čo nakoniec robí tento triediaci algoritmus stabilný .
- Aktualizovať outputArray[ countArray[ inputArray[i] ] – 1] = inputArray[i] .
- Tiež aktualizujte countArray[ inputArray[i] ] = countArray[ inputArray[i] ] – –.
Krok 6: Pre i = 6 ,
rozhranie vs abstraktná trieda
Aktualizovať outputArray[ countArray[ inputArray[6] ] – 1] = inputArray[6]
Tiež aktualizujte countArray[ inputArray[6] ] = countArray[ inputArray[6] ]- –
Krok 7: Pre i = 5 ,
Aktualizovať outputArray[ countArray[ inputArray[5] ] – 1] = inputArray[5]
Tiež aktualizujte countArray[ inputArray[5] ] = countArray[ inputArray[5] ]- –
Krok 8: Pre i = 4 ,
Aktualizovať outputArray[ countArray[ inputArray[4] ] – 1] = inputArray[4]
Tiež aktualizujte countArray[ inputArray[4] ] = countArray[ inputArray[4] ]- –
Krok 9: Pre i = 3 ,
Aktualizovať outputArray[ countArray[ inputArray[3] ] – 1] = inputArray[3]
Tiež aktualizujte countArray[ inputArray[3] ] = countArray[ inputArray[3] ]- –
Krok 10: Pre i = 2 ,
Aktualizovať outputArray[ countArray[ inputArray[2] ] – 1] = inputArray[2]
Tiež aktualizujte countArray[ inputArray[2] ] = countArray[ inputArray[2] ]- –
Krok 11: Pre i = 1 ,
Aktualizovať outputArray[ countArray[ inputArray[1] ] – 1] = inputArray[1]
Tiež aktualizujte countArray[ inputArray[1] ] = countArray[ inputArray[1] ]- –
Krok 12: Pre i = 0,
Aktualizovať outputArray[ countArray[ inputArray[0] ] – 1] = inputArray[0]
Tiež aktualizujte countArray[ inputArray[0] ] = countArray[ inputArray[0] ]- –
Algoritmus triedenia počítania:
- Deklarujte pomocné pole countArray[] veľkosti max(inputArray[])+1 a inicializujte ho pomocou 0 .
- Traverzové pole inputArray[] a mapovať každý prvok inputArray[] ako index countArray[] pole, t.j. spustiť countArray[inputArray[i]]++ pre 0 <= i < N .
- Vypočítajte súčet prefixov pre každý index poľa inputArray [].
- Vytvorte pole outputArray[] veľkosti N .
- Traverzové pole inputArray[] od konca a aktualizovať outputArray[ countArray[ inputArray[i] ] – 1] = inputArray[i] . Tiež aktualizujte countArray[ inputArray[i] ] = countArray[ inputArray[i] ]- – .
Nižšie je uvedená implementácia vyššie uvedeného algoritmu:
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--) { vystupPole[pocetPole[vstupnePole[i]] - 1] = vstupnePole[i]; countArray[inputArray[i]]--; } return vystupne pole; } public static void main(String[] argumenty) { int[] inputArray = {4, 3, 12, 1, 5, 5, 3, 9}; int[] vystupnePole = pocetSort(vstupnePole); for (int i = 0; i System.out.print(outputArray[i] + ' '); } } }> |
>
>
C#
using> System;> using> System.Collections.Generic;> class> GFG> {> > static> List<> int> >CountSort(Zoznam<> 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--) { vystupPole[pocetPole[vstupnePole[i]] - 1] = vstupnePole[i]; countArray[inputArray[i]]--; } return vystupne pole; } // Kód ovládača const inputArray = [4, 3, 12, 1, 5, 5, 3, 9]; // Triedenie vstupného poľa const outputArray = countSort(inputArray); // Tlač zoradeného poľa console.log(outputArray.join(' ')); //Tento kód prispel Utkarsh> |
kľúč na vloženie notebooku
>
>
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> => ' '> )> |
>
>Výkon
1 3 3 4 5 5 9 12>
Analýza zložitosti triedenia počítania:
- Časová zložitosť : O(N+M), kde N a M sú veľkosti inputArray[] a countArray[] resp.
- Najhorší prípad: O(N+M).
- Priemerný prípad: O(N+M).
- Najlepší prípad: O(N+M).
- Pomocný priestor: O(N+M), kde N a M sú zaberaný priestor outputArray[] a countArray[] resp.
Výhoda triedenia počítania:
- Triedenie počítania vo všeobecnosti funguje rýchlejšie ako všetky algoritmy triedenia založené na porovnávaní, ako je zlučovacie triedenie a rýchle triedenie, ak je rozsah vstupu rádovo podľa počtu vstupov.
- Počítanie triedenia je jednoduché na kódovanie
- Druh počítania je a stabilný algoritmus .
Nevýhoda triedenia počítania:
- Triedenie počítania nefunguje pri desatinných hodnotách.
- Triedenie počítania je neefektívne, ak je rozsah triedených hodnôt veľmi veľký.
- Počítanie zoradiť nie je Triedenie na mieste algoritmus, Využíva extra priestor na triedenie prvkov poľa.