public static void main(String[] args) {
int[] array={49,38,65,97,76,13,27,49,78,34,12,64,1};
int[] newArray = myCountSort(array);
System.out.println("排序之后:");
for(int i=0;i<newArray.length;i++){
System.out.print(newArray[i]+" ");
}
System.out.println();
}
public static int[] myCountSort(int[] arr){
int max=arr[0];
int min=arr[0];
for(int item:arr){
max=item>max?item:max;
min=item<min?item:min;
}
//max-min+1为差值,这样的一个数组就可以存储min到max出现的次数了,min出现的次数存放在countArr[min-min]
int[] countArr=new int[max-min+1];
for(int item:arr){
countArr[item-min]+=1;
}
// 计数累加,如果建立一个arr.length的新数组,
// 那么min+i这个数能出现的位置的最大下标为countArr[i]的值-1
for (int i=1;i<countArr.length;i++){
countArr[i]=countArr[i]+countArr[i-1];
}
//新建一个数组,把数放进去
int[] newArr=new int[arr.length];
for (int item:arr) {
newArr[--countArr[item-min]]=item;
}
//还可以直接抛弃源数组进行赋值,其实前面不用进行计数累加优化,这里会更简单
/*int newArrayIndex=0;
for(int i=0;i<countArr.length;i++){
while (countArr[i]-1<=newArrayIndex){
newArr[newArrayIndex++]=min+i;
}
}*/
return newArr;
}
来源:CSDN
作者:dalong_bamboo
链接:https://blog.csdn.net/dalong_bamboo/article/details/103800280