上一篇文章总结了基于比较的排序。此外,还有3个特例,本篇文章来介绍。
目录
一、基数排序
一图流:
二、桶排序
一图流:
三、计数排序
思路: 依次获取数组元素arr[i],用一个数组 count[] 记住 arr[i] 出现了多少次,最后按顺序放回 arr[] 数组即可
时间复杂度:O(N)
空间复杂度:O(M),M指的是数组最大值和最小值的差值
稳定性:下面的代码不稳定,但是如果最后用另一个数组接受有序的话能够稳定
public static void countingSort(int[] array){
int minVal = array[0];//找到最小值
int maxVal = array[0];//找到最大值
for (int i = 0; i < array.length; i++) {
if (array[i] > maxVal){
maxVal = array[i];
}
if (array[i] < minVal){
minVal = array[i];
}
}
//找到最大值和最小值后相减 +1 就是数组长度
int[] count = new int[maxVal - minVal + 1];
//再统计每个数出现的次数
for (int i = 0; i < array.length; i++) {
int index = array[i];
count[index - minVal]++;//这里有可能不是从0开始
}
//把count计数器逐个放到array中
int j = 0;
for (int i = 0; i < array.length; i++) {
while (count[i] > 0){
array[j++] = i + minVal;//这里同理,不一定是i出现了count[i]次
count[i]--;
}
}
}
谢谢你能看到这✍