算法思想
适用范围:量大但是范围小
时间复杂度
计数排序平均时间复杂度:o(n+k)(平方)、空间复杂度:o(k)、稳定排序、外部排序
算法描述
计数排序,不是基于元素比较,而是利用数组下标确定元素的正确位置。
排序演示
待排序列:9 3 5 4 9 1 2 7 8 1 3 6 5 3 4 0 10 9 7 9
先遍历这个无序的数列,让每一个整数按照值对号入座,对应数组下标的元素加1。
统计结果如下:
数组值:|1 2 1 3 2 2 1 2 1 4 1|
下表值:|0 1 2 3 4 5 6 7 8 9 10|
直接便利数组,输出数组元素的下标值,元素的值是几就输出多少次。
输出结果为: 0 1 1 2 3 3 3 4 4 5 5 6 7 7 8 9 9 9 10
详细过程请看下方链接 : 1.8 计数排序 | 菜鸟教程
代码
package Sort;
import java.util.Arrays;
public class 计数排序 {
public static void main(String[] args) {
int[] arr = {2,4,2,3,7,1,5,6,8,9,2,9,8,6,0};
int[] result = sort(arr);
System.out.println(Arrays.toString(result));
}
static int[] sort(int[] arr) {
int[] result = new int[arr.length]; //创建一个数组用来存储arr中的数
int[] count = new int[10]; //创建一个计数数组,
for (int i = 0; i < arr.length; i++) {
count[arr[i]]++;
}
//打印count 输出从0-9每个数出现的次数
System.out.println(Arrays.toString(count));
//累加数组 统计数组做变形,后面的元素等于前面元素的和
for (int i = 1; i < count.length; i++) {
count[i] = count[i] + count[i-1];
}
System.out.println(Arrays.toString(count));
//倒序遍历原始数组,从统计数组中找到正确位置
for (int i = arr.length-1; i >= 0; i--) {
result[--count[arr[i]]] = arr[i];
}
return result;
}
}