计数排序算法
计数排序是一种排序算法,它通过计算数组中每个唯一元素的出现次数来对数组的元素进行排序。将计数存储在辅助数组中,并通过将计数映射为辅助数组的索引来完成排序。
计数排序如何工作?
- 从给定的数组中找出最大的元素(
max
)。给定数组
- 初始化一个长度
max+1
为0的所有元素的数组。此数组用于存储数组中元素的数量。计数数组
- 将每个元素的计数存储在
count
数组中它们各自的索引处
例如:如果元素3的计数为2,则将2存储在元素的第3个位置数数大批。如果数组中不存在元素“ 5”,则在第5个位置存储0。存储的每个元素的计数
- 存储计数数组元素的累积和。它有助于将元素放入已排序数组的正确索引中。
累计数
- 在count数组中找到原始数组的每个元素的索引。这给出了累计计数。将元素放置在计算出的索引处,如下图所示。
计数排序
- 将每个元素放置在正确位置后,将其数量减少一。
计数排序算法
countSort(array,size)
max <-查找数组中的最大元素
用全零初始化计数数组
对于j <-0到大小
找到每个唯一元素的总数,然后
将计数存储在count数组中的第j个索引处
对于我<-1到最大
找到累积和并将其存储在count数组本身中
对于j <-减小到1
恢复元素到数组
将还原的每个元素的数量减少1
Java示例
import java.util.Arrays;
public class CountingSortDemo {
public static void main(String[] args) {
int[] array = { 4, 2, 2, 8, 3, 3, 1 };
// Find the maximum element in the input array
int max = findMaxElement(array);
System.out.println("Max Value in input array-" + max);
System.out.println("Original Array- " + Arrays.toString(array));
int[] sortedArr = countingSort(array, max + 1);
System.out.println("Sorted array after counting sort- " + Arrays.toString(sortedArr));
}
private static int findMaxElement(int[] array) {
int max = array[0];
for (int val : array) {
if (val > max)
max = val;
}
return max;
}
private static int[] countingSort(int[] array, int range) {
int[] output = new int[array.length];
int[] count = new int[range];
// Calculate frequency of each element, put it in count array
for (int i = 0; i < array.length; i++) {
count[array[i]]++;
}
System.out.println("Count array- " + Arrays.toString(count));
// Modify count array to get the final position of elements
for (int i = 1; i < range; i++) {
count[i] = count[i] + count[i - 1];
}
System.out.println("Modified count array- " + Arrays.toString(count));
// Add elements to output sorted array
for (int i = 0; i < array.length; i++) {
output[count[array[i]] - 1] = array[i];
count[array[i]]--;
}
return output;
}
}
输出:
Max Value in input array-8
Original Array- [4, 2, 2, 8, 3, 3, 1]
Count array- [0, 1, 2, 2, 1, 0, 0, 0, 1]
Modified count array- [0, 1, 3, 5, 6, 6, 6, 6, 7]
Sorted array after counting sort- [1, 2, 2, 3, 3, 4, 8]
复杂
时间复杂度:
主要有四个主要循环。(可以在函数外部找到最大值。)
循环 | 计数时间 |
---|---|
第一 | O(最大) |
第二名 | O(大小) |
第三名 | O(最大) |
第四名 | O(大小) |
总体复杂度= O(max)+O(size)+O(max)+O(size)
=O(max+size)
- 最坏情况的复杂性:
O(n+k)
- 最佳案例复杂度:
O(n+k)
- 平均案件复杂度:
O(n+k)
在上述所有情况下,复杂度都是相同的,因为无论元素如何放置在数组中,算法都会经历n+k
时间。
任何元素之间都没有比较,因此它比基于比较的排序技术要好。但是,如果整数很大,那是不好的,因为应该制作该大小的数组。
空间复杂度:
计数排序的空间复杂度为O(max)
。元素范围越大,空间复杂度越大。
计算排序应用程序
在以下情况下使用计数排序:
- 有多个较小的整数。
- 线性复杂度是必要的。