计数排序有一个source数组,一个count数组,一个sorted数组,count数组是可以表示source最小数 min 到最大数 max 的范围。
遍历source在count中记录对应数出现的次数。count[souce[i] - min]++
将count数据转换为对应数据应该出现的位置。count[i] += count[i - 1]
遍历source并在count获取排序位置,放入sorted中对应位置。sorted[--count[source[i] - min]] = source[i];
@Override
public int[] sort(int[] source) {
int max = source[SortUtils.maxIndex(source)];
int min = source[SortUtils.minIndex(source)];
int[] count = getCountArr(source, max, min);
LOG.d(count);
count = changeCountArrToIndex(count);
LOG.d(count);
return makeSortedArr(source, count, min);
}
private int[] getCountArr(int[] source, int max, int min){
int countSize = max - min + 1;
int[] count = new int[countSize];
for (int i = 0; i < source.length; i++){
count[source[i] - min]++;
}
return count;
}
private int[] changeCountArrToIndex(int[] count){
for (int i = 1; i < count.length; i++){
count[i] += count[i - 1];
}
return count;
}
private int[] makeSortedArr(int[] source, int[] count, int min){
int[] sorted = new int[source.length];
for (int i = 0; i < source.length; i++){
sorted[--count[source[i] - min]] = source[i];
}
return sorted;
}