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