算法描述
1.根据待排序集合中最大元素和最小元素的差值范围,申请额外空间;
2.遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内;
3.对额外空间内数据进行计算,得出每一个元素的正确位置;
代码
import java.util.Arrays;
public class CountSort {
public static void main(String[] args) {
int[] array={50,9,3, 4, 10, 3, 6, 7, 4, 1, 2,15};
if (array.length == 0) return ;
int bias, min = array[0], max = array[0];
//寻找最大最小
for (int i = 1; i < array.length; i++) {
if (array[i] > max)
max = array[i];
if (array[i] < min)
min = array[i];
}
//开辟新数组,存计数
int[] bucket = new int[max - min + 1];
//全部初始化为便于后面判断
Arrays.fill(bucket, 0);
//数组的值减min就是他在新数组的下标,累计计数
for (int i = 0; i < array.length; i++) {
bucket[array[i] -min]++;
}
//index是数组下标,i是桶下标
int index = 0, i = 0;
//将新数组放回原数组
while (index < array.length) {
//存在则取下标+min,元素值减一,到0为止
if (bucket[i] != 0) {
//之前减了min,现在加回来
array[index] = i + min;
bucket[i]--;
index++;
} else//桶的下一个位置
i++;
}
System.out.println(Arrays.toString(array));
}
}
算法分析
只有一层循环,加上额外数组带来的开销,复杂度为O(n+k),空间复杂度取决于差值大小,所以对于数值小的很快,数值大的就不要考虑了。。。