1.概念
计数排序(Counting sort)是一种非基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中以达到排序的效果。
2.计数排序平均时间复杂度:o(n+k)(平方)、空间复杂度:o(k)。
public class CountSorting {
public static void main(String[] args) {
int arr[]= {2,3,4,5,6,2,3,8,5};
sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void sort(int arr[]) { //第一步找最大最小值
int max=arr[0]; //最大值
int min=arr[0]; //最小值
for(int i=0;i<arr.length;i++) { //求最大最小值
if(max<=arr[i]) {
max=arr[i];
}
if(min>=arr[i]) {
min=arr[i];
}
}
int arr1[]=new int[max-min+1];
//第二步开辟一个新数组,该数组长度为max-min+1.
// 表示该数组的下标值范围在想遍历的数组的值都能找到对应的下标范围内,
// 比如,值为1000,出现2次,哪这个数组的下标范围就0--1000-min+1,arr[1000-min]处为2
// 出现一次就把该下标对应的值加一。
for(int j=0;j<arr.length;j++) { //第三步对计数累加
arr1[arr[j]-min]++;
int a=arr[j]-min;
System.out.println("想遍历数组的"+arr[j]+" "+"在arr1["+a+"]处计"+arr1[arr[j]-min]+"次");
}
int num =0;
for(int i=0;i<arr1.length;i++) { //第四步根据arr1[]每个值的计算次数对arr[]赋值
for(int j=arr1[i];j>0;j--) { //j为arr1[i]处的计数次数
arr[num++]=i+min;
int p=i+min;
int u=num-1;
System.out.println("这时arr["+u+"]"+"为"+p);
}
}
}
}
```java
想遍历数组的2 在arr1[0]处计1次
想遍历数组的3 在arr1[1]处计1次
想遍历数组的4 在arr1[2]处计1次
想遍历数组的5 在arr1[3]处计1次
想遍历数组的6 在arr1[4]处计1次
想遍历数组的2 在arr1[0]处计2次
想遍历数组的3 在arr1[1]处计2次
想遍历数组的8 在arr1[6]处计1次
想遍历数组的5 在arr1[3]处计2次
这时arr[0]为2
这时arr[1]为2
这时arr[2]为3
这时arr[3]为3
这时arr[4]为4
这时arr[5]为5
这时arr[6]为5
这时arr[7]为6
这时arr[8]为8
2 2 3 3 4 5 5 6 8