待优化,以支持更大范围的数组排序
package com.zk.ds;
import Utils.PrintUtils;
/**
* 计数排序<br>
* 计数排序的范围的假设是待排序的数字位于一个小范围内<br>
* 参考:算法导论-P98-计数排序一节
* @author 1291700520@qq.com
*
*/
public class CountingSort {
public static void main(String args[]){
int[] nums = {
2,5,3,0,2,3,0,3
};
nums = countSort(nums, 5);
PrintUtils.printIntArray(nums);
}
/**
* 计数排序
* @param array 只适用于元素>=0,且最大值<=maxKey的数组
* @param maxKey 最大值
* @return 排好序的数组
*/
public static int[] countSort(int array[], int maxKey){
if(array == null){
throw new NullPointerException("array is null...");
}
int[] countsArray = new int[maxKey + 1];
int len = array.length;
/*统计个数*/
for(int i=0; i<len; ++i){
countsArray[array[i]]++;
}
for(int i=1; i<countsArray.length; ++i){
countsArray[i] = countsArray[i] + countsArray[i-1];
}
/*扫描输出*/
int[] helper = new int[len];
for(int i=len-1; i>=0; --i){
helper[countsArray[array[i]]-1] = array[i];
--countsArray[array[i]];
}
return helper;
}
}