这段代码是一个计数排序算法的实现。计数排序是一种非比较排序算法,适用于整数数组,其时间复杂度为O(n+k),其中n是数组长度,k是数组中的最大值。以下是该算法的步骤:
首先检查输入数组是否为空或长度小于2,如果是,则直接返回,不进行排序。
遍历数组,找到数组中的最大值。
创建一个大小为最大值加1的桶(bucket)数组,用于存储每个元素出现的次数。
再次遍历数组,将每个元素对应的桶中的计数加1。
最后,遍历桶数组,将桶中的元素按照计数依次放回原数组中。
这段代码实现的计数排序算法的时间复杂度和空间复杂度如下:
时间复杂度
- 寻找最大值 :遍历整个数组以找到最大值,这一步的时间复杂度是 𝑂(𝑛),其中 n 是数组
arr
的长度。 - 填充桶数组:再次遍历数组以填充桶数组,这一步的时间复杂度也是 𝑂(𝑛)。
- 生成排序数组:最后,遍历桶数组并构建排序后的数组,这一步的最坏情况时间复杂度是 𝑂(𝑛+𝑘),其中 𝑘 是数组中的最大值,因为需要遍历每个非零的桶。
因此,总的时间复杂度是 𝑂(𝑛+𝑛+𝑛+𝑘)=𝑂(𝑛+𝑘)。
空间复杂度
- 桶数组:需要一个额外的数组来作为桶,其大小是输入数组中的最大值加1,即 𝑘+1。因此,空间复杂度是 𝑂(𝑘)。
综上,这段代码的时间复杂度是 𝑂(𝑛+𝑘),空间复杂度是 𝑂(𝑘)。
public class test7 {
public static void countSort(int[] arr){
if(arr ==null || arr.length <2){
return;
}
int max = Integer.MIN_VALUE;
for (int i = 0; i < arr.length; i++) {
max = Math.max(max , arr[i]);
}
int[] bucket = new int[max+1];
for (int i = 0; i < arr.length; i++) {
bucket[arr[i]]++;
}
int i =0;
for (int j = 0; j < bucket.length; j++) {
while (bucket[j]-- > 0){
arr[i++] = j;
}
}
}
}