logo

Алгоритъм за сортиране при преброяване

В тази статия ще обсъдим алгоритъма за сортиране на броене. Сортирането с броене е техника за сортиране, която се основава на ключовете между конкретни диапазони. При програмиране или технически интервюта за софтуерни инженери алгоритмите за сортиране се задават широко. Така че е важно да обсъдим темата.

Тази техника за сортиране не извършва сортиране чрез сравняване на елементи. Той извършва сортиране чрез преброяване на обекти с различни ключови стойности като хеширане. След това той извършва някои аритметични операции, за да изчисли позицията на индекса на всеки обект в изходната последователност. Сортирането чрез броене не се използва като алгоритъм за сортиране с общо предназначение.

Сортирането с преброяване е ефективно, когато обхватът не е по-голям от броя на обектите за сортиране. Може да се използва за сортиране на отрицателните входни стойности.

Сега нека видим алгоритъма за сортиране при броене.

пълна форма ide

Алгоритъм

 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 

Работа на алгоритъма за сортиране при броене

Сега нека видим работата на алгоритъма за сортиране при броене.

За да разберем работата на алгоритъма за сортиране при броене, нека вземем несортиран масив. Ще бъде по-лесно да разберете сортирането на броенето чрез пример.

Нека елементите на масива са -

Сортиране при броене

1. Намерете максималния елемент от дадения масив. Позволявам макс бъде максималния елемент.

Сортиране при броене

2. Сега инициализирайте масива с дължина максимум + 1 с всичките 0 елемента. Този масив ще се използва за съхраняване на броя на елементите в дадения масив.

Сортиране при броене

3. Сега трябва да съхраним броя на всеки елемент от масива в съответния им индекс в масива за броя.

Броят на елемент ще бъде съхранен като - Да предположим, че елементът от масива '4' се появява два пъти, така че броят на елемент 4 е 2. Следователно, 2 се съхранява на 4thпозиция на масива за преброяване. Ако някой елемент не присъства в масива, поставете 0, т.е. да предположим, че елемент '3' не присъства в масива, така че 0 ще бъде съхранен на 3rdпозиция.

inttostr java
Сортиране при броене
Сортиране при броене

Сега запазете кумулативната сума от броя елементи на масива. Това ще помогне да поставите елементите на правилния индекс на сортирания масив.

Сортиране при броене
Сортиране при броене

По същия начин кумулативният брой на масива за броене е -

конвертиране на низ в число
Сортиране при броене

4. Сега намерете индекса на всеки елемент от оригиналния масив

Сортиране при броене

След като поставите елемент на мястото му, намалете броя му с единица. Преди поставянето на елемент 2, неговият брой беше 2, но след поставянето му на правилната му позиция, новият брой за елемент 2 е 1.

Сортиране при броене

По същия начин, след сортиране, елементите на масива са -

Сортиране при броене

Сега масивът е напълно сортиран.

Преброяване на сложността на сортиране

Сега нека видим времевата сложност на сортирането на броенето в най-добрия случай, средния случай и в най-лошия случай. Ще видим и пространствената сложност на сортирането с броене.

1. Времева сложност

Случай време Сложност
Най-добър случай O(n + k)
Среден случай O(n + k)
Най-лошия случай O(n + k)
    Сложност в най-добрия случай -Това се случва, когато не е необходимо сортиране, т.е. масивът вече е сортиран. Най-добрият случай на времева сложност на сортирането на преброяването е O(n + k) .Средна сложност на случая -Това се случва, когато елементите на масива са в разбъркан ред, който не е правилно възходящ и неправилно низходящ. Средната времева сложност на сортирането на преброяването е O(n + k) .Сложност в най-лошия случай -Това се случва, когато елементите на масива трябва да бъдат сортирани в обратен ред. Това означава, че трябва да сортирате елементите на масива във възходящ ред, но неговите елементи са в низходящ ред. Най-лошият случай на времева сложност на сортирането на броенето е O(n + k) .

Във всички горепосочени случаи времевата сложност на сортирането на преброяването е една и съща. Това е така, защото алгоритъмът преминава n+k пъти, независимо от това как са разположени елементите в масива.

Сортирането чрез броене е по-добро от техниките за сортиране, базирани на сравнение, тъй като няма сравнение между елементите при сортирането чрез броене. Но когато целите числа са много големи, сортирането при броене е лошо, защото трябва да се създават масиви с такъв размер.

2. Космическа сложност

Космическа сложност O (макс.)
Стабилен ДА
  • Пространствената сложност на сортирането при броене е O(max). Колкото по-голяма е гамата от елементи, толкова по-голяма е пространствената сложност.

Внедряване на сортиране при броене

Сега нека видим програмите за сортиране на броенето на различни езици за програмиране.

програма: Напишете програма за реализиране на сортиране чрез броене на език 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;></=>

Изход

възраст на ритик рошан
Сортиране при броене

И така, това е всичко за статията. Надяваме се, че статията ще ви бъде полезна и информативна.

Тази статия не беше ограничена само до алгоритъма. Ние също така обсъдихме отчитането на сложността на сортирането, работата и изпълнението в различни езици за програмиране.