1. 计数排序:计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
2. 计数排序的时间,空间复杂度及稳定性:
1>. 时间复杂度:O(n+m)。
2>. 空间复杂度:O(n+m)。
3>. 稳定性:稳定。
3. 计数排序的实现:
//计数排序 即记录数组中数据出现的次数
/*
* 将数组中数据出现的次数放入数据对应的桶角标的桶中
* 再通过桶角标于与数据的转换关系来计算出数据
* 按照桶中数据出现的次数 将数据依次回填到原数组中
*
* index为新桶的索引 num为原数组的数据 索引与数据的关系为:
* index = num - min
* num = index + min
*/
public class CountingSort {
public static void main(String[] args) {
int[] arr = {9, 8, -2, 7, 4, 1, 0, 5, 6, 4, -2, -1, 7, 3, 1, 0, 6, 5, 4};
countingSort(arr);
System.out.println(Arrays.toString(arr));
}
//对数组进行计数排序
private static void countingSort(int[] arr) {
//1.获取数组中的最大值 和 最小值
int max = arr[0];
int min = arr[0];
for(int i = 0; i < arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
}else if(arr[i] < min) {
min = arr[i];
}
}
//2.获取桶的数量
//要明确 数据->桶角标的转换关系 和 桶角标->数据的转换关系
int count = (max - min) + 1;
//3.创建所有的桶(桶专门用于统计数据出现的次数)
int[] buckets = new int[count];
//4.遍历原数组 将每一个数据出现的次数填入对应编号的桶中
for(int i = 0; i < arr.length; i++) {
buckets[arr[i] - min]++;
}
//5.遍历桶 将桶编号对应的数字按照出现的次数依次填入到原数组中
int index = 0;
for(int i = 0; i < buckets.length; i++) {
for(int j = 1; j <= buckets[i]; j++) {
arr[index++] = i + min;
}
}
}
}
4. 运行结果: