【排序算法Java实现】计数排序

  • 代码:
/**
 * @Description:
 * 计数排序统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i≥0)。
 * 计数排序基于一个假设,待排序数列的所有数均为整数,且出现在(0,k)的区间之内。
 * 如果 k(待排数组的最大值) 过大则会引起较大的空间复杂度,一般是用来排序 0 到 100 之间的数字的最好的算法,但是它不适合按字母顺序排序人名。
 * 计数排序不是比较排序,排序的速度快于任何比较排序算法。
 * 算法思想:
 * 找出待排序的数组中最大和最小的元素;
 * 统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项;
 * 对所有的计数累加(从 C 中的第一个元素开始,每一项和前一项相加);
 * 向填充目标数组:将每个元素 i 放在新数组的第 C[i] 项,每放一个元素就将 C[i] 减去 1;
 * 平均时间复杂度:O(N + M)
 * 最优时间复杂度:O(N + M)
 * 最差时间复杂度:O(N + M)
 * 稳定性:稳定
 * @Author: chong
 * @Data: 2021/6/22 3:07 下午
 */
public class CountSortTemplate {
    public void countSort(int[] nums){
        if (nums.length == 0)
            return;
//        找到数组内最大值
        int maxValue = nums[0];
        for (int num : nums)
            maxValue = Math.max(maxValue, num);
//        创建辅助数组
        int[] bucket = new int[maxValue + 1];
//        放入桶中
        for (int num : nums) {
            bucket[num]++;
        }
//        从桶中拿出
        for (int i = 0, j = 0; i < nums.length;){
            if (bucket[j]-- > 0)
                nums[i++] = j;
            else
                j++;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值