计数排序
定义
计数排序是一种特殊的桶排序
计数排序是一种非比较性质的排序算法,元素从未排序状态变为已排序状态的过程,是由额外控件的辅助和元素本身的值决定的。
计数排序过程中不存在元素之间的比较和交换操作。根据元素本身的值,将每个元素出现的次数记录到辅助空间后,通过对辅助空间内数据的计算,即可确定每一个元素最终的位置
稳定性
稳定
时间复杂度
O(N+K) K为数值范围
适用场合
计数排序需要占用大量空间,仅适用于数据比较集中的情况.
步骤
- 根据待排序集合中最大元素和最小元素的差值范围,申请额外空间
- 遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内
- 对额外空间内数据进行计算,得出每一个元素的位置
- 将待排集合每一个元素移动到计算得出的正确位置上
代码
测试用例
int arr[] = {37,18,21,21,49,0,25,6,14};
原代码
/**
* 计数排序
* @param arr
* @param len
*/
public static void countSort1(int[] arr,int len){
// 求取最大值最小值,确定桶区间范围
// 记录数组中的最大值
int max = Integer.MIN_VALUE;
// 记录数组中的最小值
int min = Integer.MAX_VALUE;
for (int i = 0;i<len;i++){
max = Math.max(max,arr[i]);
min = Math.min(min,arr[i]);
}
System.out.println("最大值:"+max);
System.out.println("最小值:"+min);
// 长度为max的话,min如果是负数或者0的时候,下面的help[mapPos]会越界
// int help[] = new int[max];
// 辅助数组
int help[] = new int[max-min+1];
// 找出每个数字出现的次数
for (int i = 0;i<len;i++){
int mapPos = arr[i] - min;
help[mapPos]++;
}
int index = 0;
for (int i = 0;i<help.length;i++){
while (help[i]-->0){
arr[index++] = i+min;
}
}
System.out.println("排序结果:"+ Arrays.toString(arr));
}
运行结果