排序算法-基数排序(radixSort)-C

思路:

基数排序是一种非比较排序,将整数按位数拆分不同的数字,先按照低位大小排序,然后收集;再按照高位排序,继续收集;依次类推,直到最高位。

基本步骤:

  1. 计算数组中最大元素,并计算最大元素的位数;
  2. 创建一个大小为10(如果考虑负整数,设为20)的数组作为桶,并创建一个和原始数组大小相同的数组作为收集中间过程元素的临时数组,并初始化桶和数组;
  3. 清空桶中元素,并对原始数组的每个元素,从低位开始取每个位并根据该位大小将该元素插入对应的桶中;
  4. 从大到小遍历原始数组,对于原始数组中的每个元素,根据在桶中的位置,插入到临时数组中;
  5. 最后将临时数组中的元素拷贝到原始数组中;
  6. 重复上面步骤3,4,5直到数组最大元素的最高位。

时间复杂度:

最好:O(n*k);平均:O(n*k);最坏:O(n*k)(其中n是数组元素的个数,k是桶的个数)

程序:

int get_max_digit(const int array[],int array_size)
{
    int i,max_p,max_value,max_digit;
    max_digit=0;
    max_p=array_size-1;
    for(i=0;i<array_size;i++)
    {   
        if(array[i]>array[max_p])
            max_p=i;
    }   
    max_value=array[max_p];
    if(max_value==0)
        return 1;
    for(max_digit=0;max_value!=0;max_value/=10)
    {   
        max_digit++;
    }   
    return max_digit;
}

void radix_sort(int array[],int array_size)
{
    if(array_size<2)
        return ;
    int i,j,max_digit;
    int mod=10;
    int div=1;
    int buckets[20]={0};
    max_digit=get_max_digit(array,array_size);
    int *tmp_array=calloc(array_size,sizeof(int));
    if(tmp_array==NULL)
    {   
        printf("No full space! \n");
        return;
    }   
    for(i=0;i<max_digit;i++) 
    {   
        //1. initialize the buckets
        for(j=0;j<20;j++)
            buckets[j]=0;
        //2. put array elements in different buckets    
        for(j=0;j<array_size;j++)
            buckets[(array[j]/div)%mod+mod]++;
        //3. from start to end cumulative the buckets
        for(j=1;j<20;j++)
            buckets[j]+=buckets[j-1];
        //4. from end to start put array elements in tmp_array  
        for(j=array_size-1;j>=0;j--)
            tmp_array[--buckets[(array[j]/div)%mod+mod]]=array[j];
        //5. copy the array elements to the original array
        for(j=0;j<array_size;j++)
            array[j]=tmp_array[j];
        //6. increase the divisor 
        div*=mod;
    }
    free(tmp_array);
}
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;  
    int array[]={100,96,88,75,63,52,41,36,28,96,19,6,0,-19,-105,28,52,52,52};
    int array_size=sizeof(array)/sizeof(int);
    printf("Original array:\n");
    for(i=0;i<array_size;i++)
        printf(" %d, ",array[i]);
    printf("\n");
    radix_sort(array,array_size);
    printf("Sorted array:\n");
    for(i=0;i<array_size;i++)
        printf(" %d, ",array[i]);
    printf("\n");
    return 0;
}

参考:

https://www.cnblogs.com/onepixel/articles/7674659.html

https://www.runoob.com/w3cnote/ten-sorting-algorithm.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值