十大排序算法-基数排序 c语言实现

本文介绍了基数排序算法,包括其原理(按位数比较),步骤(包括找最大值、分配到桶、合并桶中数据等),以及其实现过程。特别强调了时间复杂度为O(n+k),空间复杂度为O(n*k)。
摘要由CSDN通过智能技术生成

介绍

        基数排序(Radix Sort)是一种非比较整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。

具体步骤如下:

  1. 找到待排序数组中的最大数,确定需要进行多少次分配。

  2. 创建十个桶(对应0-9),每个桶内放置对应位数的数字。

  3. 从最低位开始,对每个位数进行分配,将数字放入对应的桶中。

  4. 将所有桶中的数字依次取出,放入原数组中。

  5. 重复步骤3和4,直到最高位。

代码实现

        

//基数
void radixSort(int* base, int len){
    if(base==NULL||len<=1)
        return;

    //因为该排序方式只能排正整数,对此可以进行改进
    //若该数组的最小值小于0,则将数组中所有元素同时加上最小值的绝对值
    //这时,数组中所有元素均>=0
    //待排序完成,再将所有元素同时减去原先的最小值的绝对值

    //找出最大值和最小值
    int value_min = base[0],value_max = base[0];
    for(int i=1;i<len;i++){
        if(base[i]<value_min)
            value_min = base[i];
        if(base[i]>value_max)
            value_max = base[i];
    }

    //value_min<0,同加最小值的绝对值
    if(value_min<0){
        for(int i=0;i<len;i++)
            base[i] -= value_min;
    }

    int value_max_cur = value_min<0?value_max-value_min:value_max;

    //为桶开内存
    int* buckets = (int*)malloc(sizeof(int)*len*10);
    if(buckets==NULL)
        return;

    //每个桶中元素的数量
    int num_data_bucket[10]={0};

    //依次按照个、十、百...位将数据放入对应桶中
    int k = 1;
    while(value_max_cur/k>0){
        
        for(int i=0;i<len;i++){
            int index = (base[i]/k)%10;
            *(buckets+index*len+num_data_bucket[index]++) = base[i];
        }

        //将桶中的数据依次取出
        for(int i=0,index=0;i<10;i++)
            for(int j=0;j<num_data_bucket[i];j++)
                base[index++] = *(buckets+i*len+j);

        //清空桶
        memset(num_data_bucket,0,10*sizeof(int));

        k*=10;
    }

    //value_min<0,排序完成,同减去最小值的绝对值
    if(value_min<0){
        for(int i=0;i<len;i++)
            base[i] += value_min;
    }
}

总结

时间复杂度:O(n+k),其中n为数字的平均位数,k为数字的个数。

空间复杂度:O(n*k)。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值