手撕面试题算法<排序>(7)—— 箱排序 & 基数排序

前言之前说到的排序的时间复杂度都只受限于数组的长度,而不受限与数组元素的大小今天来讲讲一种以空间换时间的排序算法 —— 箱排序(Bin Sort),及其改良 —— 基数排序(Radix Sort)手撕算法 - 排序系列手撕面试题算法<排序>(1)—— 冒泡排序及其优化实现手撕面试题算法<排序>(2)—— 选择排序手撕面试题算法<排序>(3)—— 插入排序及其优化实现手撕面试题算法<排序>(3.5)—— 希尔排序手撕面试题算法<排序>(4)—— 归并排序手撕面试题算法<排序>(5)—— 快速
摘要由CSDN通过智能技术生成

前言

之前说到的排序的时间复杂度都只受限于数组的长度,而不受限与数组元素的大小

今天来讲讲一种以空间换时间的排序算法 —— 箱排序(Bin Sort),及其改良 —— 基数排序(Radix Sort)

为了便于理解,文章中就不引入关于包含负数数组的排序解决方案了,感兴趣的可以看我在github上发布的源码~

手撕算法 - 排序系列

手撕面试题算法<排序>(1)—— 冒泡排序及其优化实现
手撕面试题算法<排序>(2)—— 选择排序
手撕面试题算法<排序>(3)—— 插入排序及其优化实现
手撕面试题算法<排序>(3.5)—— 希尔排序
手撕面试题算法<排序>(4)—— 归并排序
手撕面试题算法<排序>(5)—— 快速排序以及快排为什么快
手撕面试题算法<排序>(6)—— 堆 & 堆排序
手撕面试题算法<排序>(7)—— 箱排序 & 基数排序

源码

看完有收获别忘了点个star哦~

箱排序

箱排序是一种时间复杂度能达到 O(n) 的排序,作为代价,它将会申请待排序数组中最大的数的大小的数组空间,空间复杂度达到 O(arr.maxValue+1),用它来排序大数值数组,是相当浪费空间的做法

思想

箱排序的排序过程无需比对数值,只需要将遍历到的数值放到对应的“箱子”里,最后再统计箱子即可,是一种分配 - 收集的思想

实现

箱排序的实现非常简单,假设待排序数组全为整数

  1. 首先遍历待排序数组,得到该数组中的最大值N
  2. 创建一个长度为N+1的数组bin:int[] bin = new int[N+1];
  3. 遍历待排序数组时,遍历到数组元素i,将bin[i] += 1
  4. 遍历完毕后,数组bin中不为0的位置都为待排序数组中出现过的元素,bin[i]的值代表i在待排序数组中出现过几次
  5. 顺序遍历数组bin中不为0的值,令bin[i] -= 1直到bin[i] == 0,并将i顺序装入待排序数组中
  6. 步骤5的过程相当于从箱子中把值取出
    在这里插入图片描述
    public static void sort(int[] arr) {
   
        // 1. 获取待排序数组中的最大值N
        int N = Integer.MIN_VALUE;
        for (int val : arr) {
   
            N = Math.max(N, val);
        }
        // 2. 依据N来构建bin数组
        int[] bin = new int[++N];

        // 3. 将待排序数组中出现过的值在bin的对应索引处统计
        for (int val : arr) {
   
            ++bin[val];
        }
        // 4. 遍历bin数组,获得顺序数组
        int idx = 0;
        for (int j = 0; j < N; ++j) {
   
     
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值