Java算法之计数排序(Counting Sort)

简介

计数排序是一种线性时间复杂度的排序算法,它不依赖于元素之间的比较,而是通过统计数组中每个元素出现的次数,然后根据这些统计信息对元素进行排序。这种算法特别适用于整数且整数的范围不是非常大时。

算法步骤

  1. 找出数组中的最大值。
  2. 创建一个计数数组,长度为最大值加一。
  3. 遍历原数组,对每个元素在计数数组中对应的位置加一。
  4. 再次遍历计数数组,将每个非零元素按顺序累加到原数组。
java 复制代码
//countingSort 方法接受数组和最大值作为参数,执行计数排序。
//首先创建一个计数数组,长度为最大值加一。
//遍历原数组,统计每个元素出现的次数。
//再次遍历计数数组,将非零元素累加到原数组。
//main 方法中,我们初始化一个数组,找出最大值,然后调用 countingSort 方法进行排序,并打印排序后的结果。
public class CountingSort {
    // 计数排序方法
    public static void countingSort(int[] arr, int maxVal) {
        int n = arr.length;
        int[] count = new int[maxVal + 1]; // 创建计数数组

        // 统计每个元素出现的次数
        for (int i = 0; i < n; i++) {
            count[arr[i]]++;
        }

        // 将计数数组中非零元素累加到原数组
        int index = 0;
        for (int i = 0; i < count.length; i++) {
            while (count[i] > 0) {
                arr[index++] = i;
                count[i]--;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {4, 2, 2, 8, 3, 3, 1};
        int maxVal = getMaxVal(arr); // 找出数组中的最大值

        countingSort(arr, maxVal);

        // 打印排序后的数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    // 辅助方法,找出数组中的最大值
    private static int getMaxVal(int[] arr) {
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }
}

优点

  • 时间效率:对于小范围整数排序,计数排序的时间复杂度是O(n+k),其中n是数组长度,k是整数的范围。
  • 稳定性:计数排序是稳定的排序算法,相等元素的相对位置不会改变。
  • 简单性:算法逻辑简单,容易实现。

缺点

  • 空间复杂度:计数排序需要额外的存储空间,其大小取决于整数的范围,空间复杂度为O(k)。
  • 适用范围:只适用于整数排序,对于非整数或整数范围非常大的情况,效率不高。

时间复杂度和空间复杂度分析

  • 时间复杂度:O(n+k),其中n是数组长度,k是整数的范围。
  • 空间复杂度:O(k),需要一个大小为k的计数数组。

使用场景

  • 当整数的范围k远小于数组长度n时,计数排序非常高效。
  • 适用于对固定范围的整数进行排序,如统计字符出现次数。
相关推荐
神奇小梵3 分钟前
java的特殊语法点,与常规语言相异的点
java·开发语言
果壳science12 分钟前
张祥前统一场论研讨会在香港理工大学举办
人工智能·算法
无巧不成书021819 分钟前
Tomcat 下载后使用全指南:解压、环境配置、启动验证与常见问题排查
java·tomcat
Wang's Blog23 分钟前
Java框架快速入门: Spring Security+OAuth2之多因子认证缓存服务
java·spring·缓存
蓝速科技26 分钟前
蓝速科技 F100 双屏翻译机:中小企业跨国会议提效方案
大数据·网络·数据结构·人工智能·科技·运维开发
桐盛科技29 分钟前
能碳数据清洗用MAD算法,窗口大小和阈值怎么调?
物联网·算法·边缘计算
Omics Pro32 分钟前
澳科大:自进化AI虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
Doubbbbbbble云33 分钟前
从算法工程化角度看空间换时间策略的权衡4
算法
wuminyu36 分钟前
Kafka配置TLS/SSL加密传输时零拷贝失效分析
java·linux·c语言·jvm·c++
边境悍匪41 分钟前
蜗牛学苑 Java 智能体学习 Day41|ElementPlus 布局、Vue‑Router 登录、Axios 思维导图复盘
java·vue.js·学习