计数排序:获取数组中的最大值max和最小值min,创建一个(最大值-最小值+1)长度的统计数组,计算每个元素出现的次数并填入对应位置(index=max-min),最后遍历统计数组中的元素即可得到有序数组。时间复杂度为O(n+m),空间复杂度为O(m)。
缺点:
1.当数组的元素的差值过大时,该算法不适用,因为会造成统计数组中出现很多0值,造成内存浪费。
2.当数组元素涉及到浮点数时,该算法不适用。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {52,59,51,57,56,53,55,54,58,66};
countSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void countSort(int[] arr){
//获取数组最大值
int max = arr[0];
//获取数组最小值
int min = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max){
max = arr[i];
}
if (arr[i] < min){
min = arr[i];
}
}
//定义计数数组
int[] countArr = new int[max-min+1];
//统计元素出现的次数
for (int i = 0; i < arr.length; i++) {
countArr[arr[i]-min]++;
}
int index = 0;
for (int i = 0; i < countArr.length; i++) {
for (int j = 0; j < countArr[i]; j++) {
arr[index++] = i+min;
}
}
}
}