logo

Algorytm sortowania zliczającego

W tym artykule omówimy algorytm sortowania zliczającego. Sortowanie przez zliczanie to technika sortowania oparta na kluczach pomiędzy określonymi zakresami. Podczas rozmów kwalifikacyjnych związanych z kodowaniem lub technicznymi programistami często zadaje się pytanie o algorytmy sortowania. Dlatego ważne jest, aby omówić ten temat.

Ta technika sortowania nie polega na sortowaniu poprzez porównywanie elementów. Wykonuje sortowanie poprzez zliczanie obiektów mających różne wartości kluczowe, takie jak hashowanie. Następnie wykonuje pewne operacje arytmetyczne, aby obliczyć pozycję indeksu każdego obiektu w sekwencji wyjściowej. Sortowanie przez zliczanie nie jest używane jako algorytm sortowania ogólnego przeznaczenia.

Sortowanie zliczające jest skuteczne, gdy zakres nie jest większy niż liczba sortowanych obiektów. Można go używać do sortowania ujemnych wartości wejściowych.

Przyjrzyjmy się teraz algorytmowi sortowania przez zliczanie.

mójlivecricket w

Algorytm

 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 

Działanie algorytmu sortowania zliczającego

Przyjrzyjmy się teraz działaniu algorytmu sortowania zliczającego.

Aby zrozumieć działanie algorytmu sortowania przez zliczanie, weźmy nieposortowaną tablicę. Sortowanie przez zliczanie będzie łatwiejsze do zrozumienia na przykładzie.

Niech elementami tablicy są -

Sortowanie zliczające

1. Znajdź element maksymalny z podanej tablicy. Pozwalać maks być elementem maksymalnym.

Sortowanie zliczające

2. Teraz zainicjuj tablicę długości maks. + 1 mający wszystkie 0 elementów. Tablica ta będzie używana do przechowywania liczby elementów w danej tablicy.

Sortowanie zliczające

3. Teraz musimy zapisać liczbę każdego elementu tablicy pod odpowiednim indeksem w tablicy count.

Liczba elementów zostanie zapisana jako - Załóżmy, że element tablicy „4” pojawi się dwa razy, więc liczba elementu 4 wyniesie 2. Zatem 2 jest przechowywane w pozycji 4tpozycja tablicy liczników. Jeśli w tablicy nie ma żadnego elementu, umieść 0, tzn. załóżmy, że w tablicy nie ma elementu „3”, więc 0 zostanie zapisane w pozycji 3r & Dpozycja.

Sortowanie zliczające
Sortowanie zliczające

Teraz zapisz skumulowaną sumę liczyć elementy tablicy. Pomoże to w umieszczeniu elementów we właściwym indeksie posortowanej tablicy.

Sortowanie zliczające
Sortowanie zliczające

Podobnie skumulowana liczba tablicy count wynosi -

Sortowanie zliczające

4. Teraz znajdź indeks każdego elementu oryginalnej tablicy

Sortowanie zliczające

Po umieszczeniu elementu na swoim miejscu zmniejsz jego liczbę o jeden. Przed umieszczeniem elementu 2 jego liczba wynosiła 2, ale po umieszczeniu go we właściwym miejscu nowa liczba elementu 2 wynosi 1.

system.out.println
Sortowanie zliczające

Podobnie po posortowaniu elementy tablicy są -

Sortowanie zliczające

Teraz tablica jest całkowicie posortowana.

Liczenie złożoności sortowania

Przyjrzyjmy się teraz złożoności czasowej sortowania przez zliczanie w najlepszym przypadku, średnim i najgorszym przypadku. Zobaczymy także złożoność przestrzenną sortowania zliczającego.

1. Złożoność czasowa

Sprawa Czas Złożoność
Najlepszy przypadek O(n + k)
Przeciętny przypadek O(n + k)
Najgorszy przypadek O(n + k)
    Najlepsza złożoność przypadku —Występuje, gdy nie jest wymagane sortowanie, czyli tablica jest już posortowana. W najlepszym przypadku złożoność czasowa sortowania przez zliczanie wynosi O(n + k) .Średnia złożoność przypadku —Dzieje się tak, gdy elementy tablicy są w pomieszanej kolejności, która nie jest prawidłowo rosnąca i nieprawidłowo malejąca. Średnia złożoność czasowa sortowania zliczającego wynosi O(n + k) .Najgorsza złożoność przypadku —Występuje, gdy elementy tablicy muszą zostać posortowane w odwrotnej kolejności. Oznacza to, że załóżmy, że musisz posortować elementy tablicy w kolejności rosnącej, ale jej elementy są w kolejności malejącej. Najgorszym przypadkiem złożoności czasowej sortowania zliczającego jest O(n + k) .

We wszystkich powyższych przypadkach złożoność czasowa sortowania zliczającego jest taka sama. Dzieje się tak, ponieważ algorytm przechodzi n+k razy, niezależnie od sposobu umieszczenia elementów w tablicy.

Podstawowe informacje o kompilacji Ubuntu

Sortowanie przez zliczanie jest lepsze niż techniki sortowania opartego na porównaniach, ponieważ podczas sortowania przez zliczanie nie ma porównania między elementami. Ale gdy liczby całkowite są bardzo duże, sortowanie przez zliczanie jest złe, ponieważ trzeba utworzyć tablice o tym rozmiarze.

2. Złożoność przestrzeni

Złożoność przestrzeni O(maks.)
Stabilny TAK
  • Złożoność przestrzenna sortowania zliczającego wynosi O(max). Im większy zakres elementów, tym większa złożoność przestrzeni.

Implementacja sortowania zliczającego

Przyjrzyjmy się teraz programom sortowania liczącego w różnych językach programowania.

Program: Napisz program realizujący sortowanie przez zliczanie w języku 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;></=>

Wyjście

Sortowanie zliczające

To tyle na temat artykułu. Mam nadzieję, że artykuł będzie dla Ciebie pomocny i pouczający.

Artykuł ten nie ograniczał się tylko do algorytmu. Omówiliśmy także złożoność sortowania przez zliczanie, działanie i implementację w różnych językach programowania.