计数排序(桶排序思想)

这段代码是一个计数排序算法的实现。计数排序是一种非比较排序算法,适用于整数数组,其时间复杂度为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;
            }
        }
    }
}
相关推荐
咫尺的梦想00736 分钟前
链表-反装链表
数据结构·链表
在黎明的反思1 小时前
进程通信之消息队列(IPC)
算法
老鱼说AI1 小时前
算法基础教学第一步:数据结构
数据结构·python·算法
Jing_Rainbow2 小时前
【LeetCode Hot100 刷题日记(19/100)】54. 螺旋矩阵 —— 数组、矩阵、模拟、双指针、层序遍历🌀
算法·面试·程序员
地平线开发者3 小时前
征程 6 | linear 高精度输出配置方式
算法·自动驾驶
小尧嵌入式3 小时前
C++基础语法总结
开发语言·c++·stm32·单片机·嵌入式硬件·算法
white-persist3 小时前
【攻防世界】reverse | IgniteMe 详细题解 WP
c语言·汇编·数据结构·c++·python·算法·网络安全
稚辉君.MCA_P8_Java3 小时前
Gemini永久会员 归并排序(Merge Sort) 基于分治思想(Divide and Conquer)的高效排序算法
java·linux·算法·spring·排序算法
地平线开发者3 小时前
征程 6 | QAT 新版 qconfig 量化模板使用教程
算法·自动驾驶
多恩Stone3 小时前
【ModelScope-1】数据集稀疏检出(Sparse Checkout)来下载指定目录
人工智能·python·算法·aigc