计数排序(桶排序思想)

这段代码是一个计数排序算法的实现。计数排序是一种非比较排序算法,适用于整数数组,其时间复杂度为O(n+k),其中n是数组长度,k是数组中的最大值。以下是该算法的步骤:

首先检查输入数组是否为空或长度小于2,如果是,则直接返回,不进行排序。

遍历数组,找到数组中的最大值。

创建一个大小为最大值加1的桶(bucket)数组,用于存储每个元素出现的次数。

再次遍历数组,将每个元素对应的桶中的计数加1。

最后,遍历桶数组,将桶中的元素按照计数依次放回原数组中。

这段代码实现的计数排序算法的时间复杂度和空间复杂度如下:

时间复杂度

  1. 寻找最大值 :遍历整个数组以找到最大值,这一步的时间复杂度是 𝑂(𝑛),其中 n 是数组 arr 的长度。
  2. 填充桶数组:再次遍历数组以填充桶数组,这一步的时间复杂度也是 𝑂(𝑛)。
  3. 生成排序数组:最后,遍历桶数组并构建排序后的数组,这一步的最坏情况时间复杂度是 𝑂(𝑛+𝑘),其中 𝑘 是数组中的最大值,因为需要遍历每个非零的桶。

因此,总的时间复杂度是 𝑂(𝑛+𝑛+𝑛+𝑘)=𝑂(𝑛+𝑘)。

空间复杂度

  1. 桶数组:需要一个额外的数组来作为桶,其大小是输入数组中的最大值加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;
            }
        }
    }
}
相关推荐
用户484526255829 小时前
数组分区和荷兰国旗只差一个条件:稳定性
排序算法
tyung9 小时前
Go 手写 Wait-Free SPSC 无界队列:无 CAS、无锁、泛型节点池
数据结构·后端·go
redaijufeng9 小时前
C++雾中风景7:闭包
c++·算法·风景
Chen_harmony9 小时前
一、数据结构概念和复杂度计算
数据结构
小欣加油9 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-10 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新10 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化
怪兽学LLM11 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
满怀冰雪11 小时前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法
CC数学建模11 小时前
2026年江西省研究生数学建模竞赛1题:空间数据分析中的过拟合识别完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模