题解 | #牛牛的桶排序#

牛牛的桶排序

http://www.nowcoder.com/questionTerminal/7c0b90cdf5d841a8b8d98f2cb3216a5a

c++题解:
桶排序就是将数据分入多个桶中,桶内单独排序,再依次输出。
1.设置一个定量的数组当作空桶子。
2.寻访序列,并且把项目一个一个放到对应的桶子去。
3.对每个不是空的桶子进行排序。
4.从不是空的桶子里把项目再放回原来的序列中。

  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型vector
     */
    vector<int> bucketSort(vector<int>& nums) {
        // write code here
        // 计入输入的最大值
        int maxValue = nums[0];
        for (int i = 1; i < nums.size(); i++)
            if (nums[i] > maxValue)  // 输入数据的最大值
                maxValue = nums[i];
        // 全是零的数组
        if(maxValue == 0){
            return nums;
        }
        // 设置10个桶,依次0,1,,,9
        const int bucketCnt = 10;
        vector<int> buckets[bucketCnt];
        // 桶的大小bucketSize根据数组最大值确定:比如最大值99, 桶大小10
        // 最大值999,桶大小100
        // 根据最高位数字映射到相应的桶,映射函数为 arr[i]/bucketSize
        int bucketSize = 1;
        while (maxValue) {      //求最大尺寸
            maxValue /= 10;
            bucketSize *= 10;
        }
        bucketSize /= 10;       //桶的个数
        // 入桶
        for (int i = 0; i < nums.size(); i++) {
            int idx = nums[i] / bucketSize;           //放入对应的桶
            buckets[idx].push_back(nums[i]);
            // 对该桶使用插入排序(因为数据过少,插入排序即可),维持该桶的有序性
            for (int j = int(buckets[idx].size()) - 1; j > 0; j--) {
                if (buckets[idx][j] < buckets[idx][j - 1]) {
                    swap(buckets[idx][j], buckets[idx][j - 1]);
                }
            }
        }
        // 顺序访问桶,得到有序数组
        for (int i = 0, k = 0; i < bucketCnt; i++) {
            for (int j = 0; j < int(buckets[i].size()); j++) {
                nums[k++] = buckets[i][j];
            }
        }
        return nums;
    }
};
全部评论

相关推荐

野猪不是猪🐗:现在的环境就是这样,供远大于求。 以前卡学历,现在最高学历不够卡了,还要卡第一学历。 还是不够筛,于是还要求得有实习、不能有gap等等... 可能这个岗位总共就一个hc,筛到最后还是有十几个人满足这些要求。他们都非常优秀,各方面都很棒。 那没办法了,看那个顺眼选哪个呗。 很残酷,也很现实
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务