Алгоритм сортировки подсчетом - ArtemGunin/GuninJavaEducation GitHub Wiki

Алгоритм сортировки подсчетом

Сортировка подсчетом — это алгоритм сортировки, который сортирует элементы массива, подсчитывая количество вхождений каждого уникального элемента в массиве. Счетчик хранится во вспомогательном массиве, а сортировка выполняется путем отображения счетчика как индекса вспомогательного массива.


Работа сортировки подсчетом

  1. Найдите максимальный элемент (пусть это будет max) из заданного массива
1654523579_707_Zahlender-Sortieralgorithmus

Данный массив

  1. Инициализировать массив длины max+1 все элементы 0. Этот массив используется для хранения количества элементов в массиве.
1654523579_756_Zahlender-Sortieralgorithmus

Счетный массив

  1. Сохраните количество каждого элемента в соответствующем индексе в count множество Например: если счетчик элемента 3 равен 2, то 2 сохраняется в 3-й позиции считать множество. Если элемент «5» отсутствует в массиве, то 0 сохраняется в 5-й позиции.
1654523579_337_Zahlender-Sortieralgorithmus

Количество сохраненных элементов

  1. Храните кумулятивную сумму элементов массива count. Это помогает поместить элементы в правильный индекс отсортированного массива.
1654523579_285_Zahlender-Sortieralgorithmus

Совокупный счет

  1. Найдите индекс каждого элемента исходного массива в массиве count. Это дает кумулятивный счет. Поместите элемент в индекс, рассчитанный, как показано на рисунке ниже.
1654523580_401_Zahlender-Sortieralgorithmus

Сортировка подсчетом

  1. После размещения каждого элемента в правильном месте уменьшите его количество на единицу.

Алгоритм сортировки подсчетом

countingSort(array, size)
  max <- find largest element in array
  initialize count array with all zeros
  for j <- 0 to size
    find the total count of each unique element and 
    store the count at jth index in count array
  for i <- 1 to max
    find the cumulative sum and store it in count array itself
  for j <- size down to 1
    restore the elements to array
    decrease count of each element restored by 1Copy

Код сортировки подсчетом в Java

// Counting sort in Java programming

import java.util.Arrays;

class CountingSort {
  void countSort(int array[], int size) {
    int[] output = new int[size + 1];

    // Find the largest element of the array
    int max = array[0];
    for (int i = 1; i < size; i++) {
      if (array[i] > max)
        max = array[i];
    }
    int[] count = new int[max + 1];

    // Initialize count array with all zeros.
    for (int i = 0; i < max; ++i) {
      count[i] = 0;
    }

    // Store the count of each element
    for (int i = 0; i < size; i++) {
      count[array[i]]++;
    }

    // Store the cummulative count of each array
    for (int i = 1; i <= max; i++) {
      count[i] += count[i - 1];
    }

    // Find the index of each element of the original array in count array, and
    // place the elements in output array
    for (int i = size - 1; i >= 0; i--) {
      output[count[array[i]] - 1] = array[i];
      count[array[i]]--;
    }

    // Copy the sorted elements into original array
    for (int i = 0; i < size; i++) {
      array[i] = output[i];
    }
  }

  // Driver code
  public static void main(String args[]) {
    int[] data = { 4, 2, 2, 8, 3, 3, 1 };
    int size = data.length;
    CountingSort cs = new CountingSort();
    cs.countSort(data, size);
    System.out.println("Sorted Array in Ascending Order: ");
    System.out.println(Arrays.toString(data));
  }
}Copy

Сложность

Time Complexity
Лучший О(п+к)
Худший О(п+к)
Средний О(п+к)
Space Complexity О (макс.)
Stability Да

Time Complexities

В основном есть четыре основных цикла. (Поиск наибольшего значения можно выполнить вне функции.)

для цикла время подсчета
1-й О (макс.)
2-й О (размер)
3-й О (макс.)
4-й О (размер)

Общая сложность = O(max)+O(size)+O(max)+O(size) знак равно O(max+size)

  • Worst Case Complexity: O(n+k)
  • Best Case Complexity: O(n+k)
  • Average Case Complexity: O(n+k)

Во всех вышеперечисленных случаях сложность одинакова, потому что независимо от того, как расположены элементы в массиве, алгоритм проходит через n+k раз.

Между какими-либо элементами нет сравнения, поэтому это лучше, чем методы сортировки на основе сравнения. Но это плохо, если целые числа очень большие, потому что должен быть создан массив такого размера.


Space Complexity

Пространственная сложность сортировки подсчетом O(max). Чем больше диапазон элементов, тем больше сложность пространства.


Приложения сортировки подсчетом

Сортировка подсчетом используется, когда:

  • есть меньшие целые числа с несколькими подсчетами.
  • линейная сложность — это необходимость.

⚠️ **GitHub.com Fallback** ⚠️