计数排序常用于纯数字的排序,速度很快,也很实用
小数据采用计数排序,空间换时间
package sort;
//计数排序 常用于数字排序 用空间换时间策略
public class CountIntegerSort {
/*
* 2 4 6 8 8 6
* 1 0 1 0 2 0 2
* 0 1 2 3 4 5 6
*/
public static void sort(int[] arr) {
if(arr==null||arr.length==1) {
return;
}
int min=findmin(arr);
int max=findmax(arr);
int[] count=new int[max-min+1];//创建空数组用来统计数字的次数。
for(int i=0;i<arr.length;i++) {
count[arr[i]-min]++;//将原值对应的次数存到新数组中
}
int index=0;
for(int i=0;i<count.length;) {//根据次数重新给arr赋值,也就是排序。
if(count[i]!=0) {
arr[index++]=i+min;
count[i]--;
continue;
}else {
i++;
}
}
}
private static int findmax(int[] arr) {
int max=arr[0];
// TODO Auto-generated method stub
for(int i=0;i<arr.length;i++) {
if(arr[i]>max) {
max=arr[i];
}
}
return max;
}
private static int findmin(int[] arr) {
int min=arr[0];
// TODO Auto-generated method stub
for(int i=0;i<arr.length;i++) {
if(arr[i]<min) {
min=arr[i];
}
}
return min;
}
}