排序算法-计数排序

计数排序(Counting Sort)是一种基于计数数组 的非比较排序算法,特别适用于整数数据范围较小,分布比较连续,跨度小的情况。它的核心思想是通过统计每个元素出现的次数,然后直接计算元素在有序序列中的位置。

计数排序的核心思想

  1. 统计频率:遍历原数组,统计每个元素出现的次数,存入计数数组。

  2. 累加计数:将计数数组转换为前缀和形式,表示每个元素在有序数组中的最后位置。

  3. 反向填充:从原数组末尾开始,根据计数数组确定元素位置,保持排序的稳定性。

代码实现

java 复制代码
package Sort;

import java.util.Arrays;

public class CountingSort {
    public static void main(String[] args) {
        int[] res = getCountSort(new int[]{5,8,9,3,1,2,6,4,7});
        for (int i = 0; i < res.length; i++) {
            System.out.print(res[i]+" ");
        }
    }
    //步骤:
    //1.寻找数组中的最大和最小值,用于计算计数数组的容量
    //2.遍历原数组,将原数组中每个元素的值转化为计数数组的下标
    //并统计元素的个数
    //3.遍历访问计数数组,将计数数组中的元素转换后,重新写回到原数组
    public static int[] getCountSort(int[] nums){
        if (nums.length == 0) return nums;
        //1.寻找数组中最大,最小值,
        //bias:偏移量,用于定位原数组每个元素在计数数组中的下标位置
        int bias;
        int min = nums[0], max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > max){
                max = nums[i];
            }
            if (nums[i] < min){
                min = nums[i];
            }
        }
        bias = 0 - min;

        //获得计数数组的容量
        int[] counterArray = new int[max-min+1];
        Arrays.fill(counterArray,0);//将计数数组初始化为0

        //2.遍历原始数组,将原始数组的每个元素作为计数数组的下标,并统计元素的个数作为计数数组的值
        for (int i = 0; i < nums.length; i++) {
            counterArray[nums[i] + bias]++;
        }

        //3.遍历访问计数数组,将计数数组中的元素转换后,重新写回到原数组
        int index = 0;//访问原始数组时的下标计数器
        int i =0;//访问计数数组时的下标计数器
        while (index < nums.length){
            //只要计数数组中当前下标元素的值不为0,就将计数数组中的元素转换,重写到原数组中
            if (counterArray[i] != 0){
                nums[index] = i - bias;
                counterArray[i]--;
                index++;
            }else {
                i++;
            }
        }
        return nums;
    }
}

时间复杂度

  • O(n + k) ,其中 n 是元素个数,k 是数据范围(最大值 max)。

  • k = O(n) 时,效率极高(线性时间)。

空间复杂度

  • O(n + k)(需要计数数组和输出数组)。

适用场景

  • 数据为整数(或可映射为整数)。

  • 数据范围较小(否则计数数组会过大)。

相关推荐
电商API_1800790524727 分钟前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
一点程序41 分钟前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
C雨后彩虹43 分钟前
计算疫情扩散时间
java·数据结构·算法·华为·面试
2601_949809591 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
vx_BS813301 小时前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_949868361 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
达文汐2 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
培风图南以星河揽胜2 小时前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划
启山智软2 小时前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋2 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化