基数排序--C++实现

1. 描述

对于待排序的base进制的一维数组。建立base(0~base - 1)个桶。
第digit轮, 根据 val % (base << (digit))将数据放入桶中,放桶时插入排序, 直到所有数据都放在了0号桶。

2. 代码


#include <iostream>
#include <algorithm>

struct bucket{

    explicit bucket(int val = 0,struct  bucket *next = nullptr):val_(val),next_(next)
    {}
    ~bucket()
    { }

    void insert(struct bucket *ins)
    {
        struct bucket *cur = this;

        while (cur->next_ && ins->val_ >= cur->next_->val_)
            cur = cur->next_;

        ins->next_ = cur->next_;
        cur->next_ = ins;
    }
    int nodeNum() const
    {
        int cnt = 0;
        auto cur = this;
        while (cur->next_) {
            ++cnt;
            cur = cur->next_;
        }

        return cnt;
    }


    int val_;
    struct bucket *next_;
};

int put2arr(int *arr, struct bucket *bucketArr, int base)
{
    int bucketNum = 0;
    int idx = 0;

    for ( int i = 0; i < base; ++i) {

        struct bucket *cur = &bucketArr[i];

        if ( cur && cur->next_) {
            ++bucketNum;
            cur = cur->next_;
            while (cur) {
                arr[idx++] = cur->val_;
                cur = cur->next_;
            }
        }

        bucketArr[i].next_ = nullptr;
    }

    return bucketNum;
}


void radixSort(int *arr, int len, int base)
{
    if ( !len || !arr || (base < 0 || base > 16) )
        return ;

    auto bucketArr = new bucket[base];
    auto dataArr = new bucket[len];

    int nonEmptyCnt = 0;
    int modNum = 1;

    while ( nonEmptyCnt != 1) {

        for (int i = 0;i < base;++i)
            bucketArr[i].next_ = nullptr;

        for (int i = 0; i < len; ++i) {
            int bucketIdx = arr[i] / modNum % 10;
            dataArr[i].val_ = arr[i];
            dataArr[i].next_ = nullptr;

            bucketArr[bucketIdx].insert(&dataArr[i]);
        }

        nonEmptyCnt = put2arr(arr, bucketArr, base);
        modNum *= 10;
    }


    put2arr(arr, bucketArr, base);

    for (int i = 0; i < len; ++i)
        dataArr[i].next_ = nullptr;


    delete []bucketArr;
    delete []dataArr;
}

int main()
{
    std::cout << "Hello, World!" << std::endl;

    int arr[] = { 21,9, 1234, 19, 0, 8, 20, 11};
    int len   = static_cast<int>(sizeof(arr)/sizeof(arr[0]));


    std::cout << len << std::endl;

    radixSort( arr, len, 10);


    for ( int i = 0; i < len; ++i)
        std::cout << arr[i] << "\t";

    std::cout << std::endl;

    return 0;
}

3. 理解

kbucketsort,和将桶内数据放回原数组。
k = f l o o r ( l o g b a s e ( m a x V a l ) ) ‘ k = floor(log_{base}(maxVal))` k=floor(logbase(maxVal))

4. Ref

GeekForGeek

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值