logo

Algoritmus triedenia počítania

V tomto článku budeme diskutovať o algoritme triedenia počítania. Triedenie počítania je technika triedenia, ktorá je založená na kľúčoch medzi konkrétnymi rozsahmi. Pri kódovaní alebo technických pohovoroch pre softvérových inžinierov sú často kladené otázky na triediace algoritmy. Preto je dôležité diskutovať o téme.

Táto technika triedenia nevykonáva triedenie porovnávaním prvkov. Vykonáva triedenie počítaním objektov s odlišnými kľúčovými hodnotami, ako je hashovanie. Potom vykoná niekoľko aritmetických operácií na výpočet indexovej pozície každého objektu vo výstupnej sekvencii. Triedenie počítania sa nepoužíva ako všeobecný algoritmus triedenia.

Triedenie počítania je účinné, keď rozsah nie je väčší ako počet objektov, ktoré sa majú triediť. Môže sa použiť na triedenie záporných vstupných hodnôt.

Teraz sa pozrime na algoritmus triedenia počítania.

Proces Android acore sa stále zastavuje

Algoritmus

 countingSort(array, n) // 'n' is the size of array max = find maximum element in the given array create count array with size maximum + 1 Initialize count array with all 0's for i = 0 to n find the count of every unique element and store that count at ith position in the count array for j = 1 to max Now, find the cumulative sum and store it in count array for i = n to 1 Restore the array elements Decrease the count of every restored element by 1 end countingSort 

Fungovanie algoritmu triedenia počítania

Teraz sa pozrime na fungovanie algoritmu triedenia počítania.

Aby sme pochopili fungovanie triediaceho algoritmu počítania, zoberme si nezoradené pole. Na príklade bude jednoduchšie pochopiť triedenie počítania.

Nech sú prvky poľa -

Počítanie Triediť

1. Nájdite maximálny prvok z daného poľa. Nechaj max byť maximálnym prvkom.

Počítanie Triediť

2. Teraz inicializujte pole dĺžky max + 1 so všetkými 0 prvkami. Toto pole sa použije na uloženie počtu prvkov v danom poli.

Počítanie Triediť

3. Teraz musíme uložiť počet každého prvku poľa na ich zodpovedajúcom indexe v poli počtu.

Počet prvku bude uložený ako - Predpokladajme, že prvok poľa '4' sa objavil dvakrát, takže počet prvku 4 je 2. Preto je 2 uložený na 4.thpozícia počítacieho poľa. Ak sa v poli nenachádza žiadny prvok, umiestnite 0, t.j. predpokladajme, že prvok „3“ nie je prítomný v poli, takže 0 bude uložená na 3rdpozíciu.

Počítanie Triediť
Počítanie Triediť

Teraz uložte kumulatívny súčet počítať prvky poľa. Pomôže umiestniť prvky na správny index zoradeného poľa.

Počítanie Triediť
Počítanie Triediť

Podobne kumulatívny počet poľa počtu je -

Počítanie Triediť

4. Teraz nájdite index každého prvku pôvodného poľa

Počítanie Triediť

Po umiestnení prvku na jeho miesto znížte jeho počet o jeden. Pred umiestnením prvku 2 bol jeho počet 2, ale po jeho umiestnení na správnu pozíciu je nový počet prvku 2 1.

java konštanta
Počítanie Triediť

Podobne po zoradení sú prvky poľa -

Počítanie Triediť

Teraz je pole úplne zoradené.

Počítanie zložitosti triedenia

Teraz sa pozrime na časovú zložitosť triedenia počítania v najlepšom prípade, priemernom prípade a v najhoršom prípade. Uvidíme aj priestorovú náročnosť počítania.

1. Časová zložitosť

Prípad Čas Zložitosť
Najlepší prípad O(n + k)
Priemerný prípad O(n + k)
V najhoršom prípade O(n + k)
    Najlepšia zložitosť prípadu -Vyskytuje sa, keď nie je potrebné žiadne triedenie, t. j. pole je už zoradené. Najlepšia časová zložitosť triedenia počítania je O(n + k) .Priemerná zložitosť prípadu -Vyskytuje sa vtedy, keď sú prvky poľa v premiešanom poradí, ktoré nie je správne vzostupné a nesprávne zostupné. Priemerná časová zložitosť triedenia počítania je O(n + k) .Zložitosť najhoršieho prípadu -Vyskytuje sa, keď sa vyžaduje, aby boli prvky poľa zoradené v opačnom poradí. To znamená, že musíte zoradiť prvky poľa vo vzostupnom poradí, ale jeho prvky sú v zostupnom poradí. Najhorší prípad časovej zložitosti triedenia počítania je O(n + k) .

Vo všetkých vyššie uvedených prípadoch je časová zložitosť triedenia počítania rovnaká. Je to preto, že algoritmus prechádza n+k bez ohľadu na to, ako sú prvky umiestnené v poli.

java bool na reťazec

Triedenie počítania je lepšie ako techniky triedenia založené na porovnávaní, pretože pri triedení počítania neexistuje žiadne porovnanie medzi prvkami. Keď sú však celé čísla veľmi veľké, triedenie počítania je zlé, pretože je potrebné vytvoriť polia tejto veľkosti.

2. Zložitosť priestoru

Vesmírna zložitosť O (max.)
Stabilný ÁNO
  • Priestorová zložitosť triedenia počítania je O(max). Čím väčší je rozsah prvkov, tým väčšia je zložitosť priestoru.

Implementácia triedenia počítania

Teraz sa pozrime na programy triedenia počítania v rôznych programovacích jazykoch.

Program: Napíšte program na implementáciu triedenia počítania v jazyku C.

 #include int getMax(int a[], int n) { int max = a[0]; for(int i = 1; i max) max = a[i]; } return max; //maximum element from the array } void countSort(int a[], int n) // function to perform counting sort { int output[n+1]; int max = getMax(a, n); int count[max+1]; //create count array with size [max+1] for (int i = 0; i <= max; ++i) { count[i]="0;" initialize count array with all zeros } for (int i="0;" < n; i++) store the of each element count[a[i]]++; for(int i<="max;" +="count[i-1];" find cumulative frequency * this loop will index original in array, and place elements output array* - 1;>= 0; i--) { output[count[a[i]] - 1] = a[i]; count[a[i]]--; // decrease count for same numbers } for(int i = 0; i<n; 16 i++) { a[i]="output[i];" store the sorted elements into main array } void printarr(int a[], int n) * function to print i; for (i="0;" i < n; printf('%d ', a[i]); main() a[]="{" 11, 30, 24, 7, 31, }; n="sizeof(a)/sizeof(a[0]);" printf('before sorting are - 
'); printarr(a, n); countsort(a, printf('
after return 0; pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/93/counting-sort-algorithm-12.webp" alt="Counting Sort"> <p> <strong>Program:</strong> Write a program to implement counting sort in C++.</p> <pre> #include using namespace std; int getMax(int a[], int n) { int max = a[0]; for(int i = 1; i max) max = a[i]; } return max; //maximum element from the array } void countSort(int a[], int n) // function to perform counting sort { int output[n+1]; int max = getMax(a, n); int count[max+1]; //create count array with size [max+1] for (int i = 0; i <= max; ++i) { count[i]="0;" initialize count array with all zeros } for (int i="0;" < n; i++) store the of each element count[a[i]]++; for(int i<="max;" +="count[i-1];" find cumulative frequency * this loop will index original in array, and place elements output array* - 1;>= 0; i--) { output[count[a[i]] - 1] = a[i]; count[a[i]]--; // decrease count for same numbers } for(int i = 0; i<n; 11 i++) { a[i]="output[i];" store the sorted elements into main array } void printarr(int a[], int n) * function to print i; for (i="0;" i < n; cout< <a[i]<<' '; main() a[]="{" 31, 11, 42, 7, 30, }; n="sizeof(a)/sizeof(a[0]);" cout<<'before sorting are - 
'; printarr(a, n); countsort(a, cout<<'
after return 0; pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/93/counting-sort-algorithm-13.webp" alt="Counting Sort"> <p> <strong>Program:</strong> Write a program to implement counting sort in C#.</p> <pre> using System; class CountingSort { static int getMax(int[] a, int n) { int max = a[0]; for(int i = 1; i max) max = a[i]; } return max; //maximum element from the array } static void countSort(int[] a, int n) // function to perform counting sort { int[] output = new int [n+1]; int max = getMax(a, n); int[] count = new int [max+1]; //create count array with size [max+1] for (int i = 0; i <= max; ++i) { count[i]="0;" initialize count array with all zeros } for (int i="0;" < n; i++) store the of each element count[a[i]]++; for(int i<="max;" +="count[i-1];" find cumulative frequency * this loop will index original in array, and place elements output array* - 1;>= 0; i--) { output[count[a[i]] - 1] = a[i]; count[a[i]]--; // decrease count for same numbers } for(int i = 0; i<n; 3 i++) { a[i]="output[i];" store the sorted elements into main array } static void printarr(int[] a, int n) * function to print i; for (i="0;" i < n; console.write(a[i] + ' '); main() int[] a="{" 43, 31, 2, 7, 10, 1, 5, 6, }; n="a.Length;" console.write('before sorting are - 
'); printarr(a,n); countsort(a,n); console.write('
after pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/93/counting-sort-algorithm-14.webp" alt="Counting Sort"> <p> <strong>Program:</strong> Write a program to implement counting sort in Java.</p> <pre> class CountingSort { int getMax(int[] a, int n) { int max = a[0]; for(int i = 1; i max) max = a[i]; } return max; //maximum element from the array } void countSort(int[] a, int n) // function to perform counting sort { int[] output = new int [n+1]; int max = getMax(a, n); //int max = 42; int[] count = new int [max+1]; //create count array with size [max+1] for (int i = 0; i <= max; ++i) { count[i]="0;" initialize count array with all zeros } for (int i="0;" < n; i++) store the of each element count[a[i]]++; for(int i<="max;" +="count[i-1];" find cumulative frequency * this loop will index original in array, and place elements output array* - 1;>= 0; i--) { output[count[a[i]] - 1] = a[i]; count[a[i]]--; // decrease count for same numbers } for(int i = 0; i<n; 41 i++) { a[i]="output[i];" store the sorted elements into main array } * function to print void printarray(int a[], int n) i; for (i="0;" i < n; system.out.print(a[i] + ' '); public static main(string args[]) a[]="{" 11, 30, 24, 7, 31, 16, 39, }; n="a.length;" countingsort c1="new" countingsort(); system.out.println('
before sorting are - c1.printarray(a, n); c1.countsort(a,n); system.out.println('
after system.out.println(); pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/93/counting-sort-algorithm-15.webp" alt="Counting Sort"> <p> <strong>Program:</strong> Write a program to implement counting sort in PHP.</p> <pre> <?php function getMax($a, $n) { $max = $a[0]; for($i = 1; $i $max) $max = $a[$i]; } return $max; //maximum element from the array } function countSort(&$a, $n) // function to perform counting sort { $LeftArray = array($n + 1); $max = getMax($a, $n); $count = array($max + 1); //create count array with size [max+1] for ($i = 0; $i <= $max; ++$i) { $count[$i] = 0; // Initialize count array with all zeros } for ($i = 0; $i < $n; $i++) // Store the count of each element { $count[$a[$i]]++; } for($i = 1; $i= 0; $i--) { $output[$count[$a[$i]] - 1] = $a[$i]; $count[$a[$i]]--; // decrease count for same numbers } for($i = 0; $i<$n; $i++) { $a[$i] = $output[$i]; //store the sorted elements into main array } } /* Function to print the array elements */ function printArray($a, $n) { for($i = 0; $i < $n; $i++) { print_r($a[$i]); echo ' '; } } $a = array( 9, 28, 22, 5, 29, 14, 37, 28, 9 ); $n = count($a); echo 'Before sorting array elements are - <br>&apos;; printArray($a, $n); countSort($a,$n); echo &apos; <br> After sorting array elements are - <br>&apos;; printArray($a, $n); ?&gt; </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/93/counting-sort-algorithm-16.webp" alt="Counting Sort"> <p>So, that&apos;s all about the article. Hope the article will be helpful and informative to you.</p> <p>This article was not only limited to the algorithm. We have also discussed counting sort complexity, working, and implementation in different programming languages.</p> <hr></n;></=></pre></n;></=></pre></n;></=></pre></n;></=>

Výkon

Počítanie Triediť

Tak, to je o článku všetko. Dúfam, že článok bude pre vás užitočný a poučný.

Tento článok nebol obmedzený len na algoritmus. Diskutovali sme aj o počítaní zložitosti triedenia, práci a implementácii v rôznych programovacích jazykoch.