前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >桶排序、 计数排序、 基数排序 && 排序后邻数最大差值

桶排序、 计数排序、 基数排序 && 排序后邻数最大差值

原创
作者头像
大学里的混子
修改2019-02-18 15:25:31
4140
修改2019-02-18 15:25:31
举报
文章被收录于专栏:LeetCode

一.桶排序、 计数排序、 基数排序

  1. 非基于比较的排序, 与被排序的样本的实际数据状况很有关系, 所

以实际中并不经常使用

  1. 时间复杂度O(N), 额外空间复杂度O(N)
  2. 稳定的排序

二.排序后邻数最大差值

给定一个数组, 求如果排序之后, 相邻两数的最大差值, 要求时

间复杂度O(N), 且要求不能用非基于比较的排序。

代码语言:javascript
复制
    public static int maxGap(int[] nums) {
        if (nums == null && nums.length<2){
            return 0;
        }
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < nums.length;i++){
            min = Math.min(nums[i],min);
            max = Math.max(nums[i],max);
        }
        if (min == max) return 0;
        int [] maxs = new int[nums.length+1];
        int [] mins = new int[nums.length+1];
        boolean[] hasNum = new boolean[nums.length+1];
        for (int i = 0 ; i < nums.length ;i++){
            int bid = bucket(nums[i],nums.length,min,max);
            maxs[bid] = hasNum[bid] ? Math.max(maxs[bid],nums[i]):nums[i];
            mins[bid] = hasNum[bid] ? Math.min(mins[bid],nums[i]):nums[i];
            hasNum[bid] = true;
        }
        int lastMax = maxs[0];
        int res = 0;
        for (int i = 1;i<= nums.length ;i++){
            if (hasNum[i]){
                res = Math.max(res,mins[i] - lastMax);
                lastMax = maxs[i];
            }
        }
        return res;
    }

    public static int bucket(long num, long len, long min, long max) {
        return (int) ((num - min) * len / (max - min));
    }
  1. n 个数采用n+1个桶,那么会存在一个空桶,所需要的结果一定不在一个桶的内部。
  2. 最终的结果也并不是存在一个空桶的两侧
  3. 最终的结果是需逐个比较
  4. 这里存在一个空桶,那么最终的结果将不会在一个桶的内部,这也是空桶的作用

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.桶排序、 计数排序、 基数排序
  • 二.排序后邻数最大差值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档