Алгоритм сортировки подсчетом - ArtemGunin/GuninJavaEducation GitHub Wiki
Сортировка подсчетом — это алгоритм сортировки, который сортирует элементы массива, подсчитывая количество вхождений каждого уникального элемента в массиве. Счетчик хранится во вспомогательном массиве, а сортировка выполняется путем отображения счетчика как индекса вспомогательного массива.
- Найдите максимальный элемент (пусть это будет max) из заданного массива

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

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

Количество сохраненных элементов
- Храните кумулятивную сумму элементов массива count. Это помогает поместить элементы в правильный индекс отсортированного массива.

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

Сортировка подсчетом
- После размещения каждого элемента в правильном месте уменьшите его количество на единицу.
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
// 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 | Да |
В основном есть четыре основных цикла. (Поиск наибольшего значения можно выполнить вне функции.)
для цикла | время подсчета |
---|---|
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 раз.
Между какими-либо элементами нет сравнения, поэтому это лучше, чем методы сортировки на основе сравнения. Но это плохо, если целые числа очень большие, потому что должен быть создан массив такого размера.
Пространственная сложность сортировки подсчетом O(max). Чем больше диапазон элементов, тем больше сложность пространства.
Сортировка подсчетом используется, когда:
- есть меньшие целые числа с несколькими подсчетами.
- линейная сложность — это необходимость.