int max = array[0];// 最大值for(int i =1; i < array.length; i++){if(array[i]> max) max = array[i];}int[] output =newint[array.length];int[] counts =newint[10];for(int divider =1; divider <= max; divider *=10){// 对每一位进行计数排序coutingSort(divider, output, counts);}
privatevoidcountingSort(int divider,int[] output,int[] counts){for(int i =0; i < counts.length; i++){
counts[i]=0;}for(int i =0; i < array.length; i++){
counts[array[i]/ divider %10]++;}for(int i =1; i < counts.length; i++){
counts[i]+= counts[i -1];}for(int i = array.length -1; i >=0; i--){
output[--counts[array[i]/ divider %10]]= array[i];}for(int i =0; i < array.length; i++){
array[i]= output[i];}}
最好、最坏、平均时间复杂度:O(d*(n+k)),d是最大值的位数,k是进制。属于稳定排序
空间复杂度:O(n+k),k是进制
另一种思路
int max = array[0];// 最大值for(int i =1; i < array.length; i++){if(array[i]> max){
max = array[i];}}
// 桶数组int[][] buckets =newint[10][array.length];// 每个桶的元素数量int[] bucketSizes =newint[buckets.length];for(int divider =1; divider <= max; divider *=10){for(int i =0; i< array.length; i++){int no = array[i]/ divider %10;
buckets[no][bucketSizes[no]++]= array[i];}int index =0;for(int i =0; i < buckets.length; i++){for(int j =0; j< bucketSizes[i]; j++){
array[index++]= buckets[i][j];}
bucketSizes[i]=0;}}