基本思想:
计算待排序数组的最大值和最小值
以此建立一个计数数组,用于保存待排序数组中不同元素出现次数
遍历计数数组,按照不同元素的出现次数重新填充有序数组
比如数组3 1 3 5 4 3 7 6
得到计数数组为1 0 3 1 1 1 1
此时计数数组的每个元素下标,加上待排序数组最小值,即为该元素值
也就是说,可以得到1出现次数为1,2出现次数为0,3出现次数为3,以此类推
故计算得有序数组为1 3 3 3 4 5 6 7
代码实现:
//计数排序
public void countSort() {
int min = array[0];
int max = array[0];
int arrayIndex = 0, countIndex = 0;
for (int i = 1; i < array.length; i++) {
if (array[i] > max)
max = array[i];
if (array[i] < min)
min = array[i];
}
int[] countArray = new int[max - min + 1];
for (int i : array) {
countArray[i - min]++;
}
while (arrayIndex < array.length) {
if (countArray[countIndex] != 0) {
array[arrayIndex] = countIndex + min;
countArray[countIndex]--;
arrayIndex++;
} else {
countIndex++;
}
}
}
时间复杂度:O(n + k),k为待排序数的范围,即最大值与最小值之差
空间复杂度:因为需要额外开辟一个长度为k的数组用于计数,故空间复杂度为O(n + k)
稳定性:计数排序是稳定的