基数排序-Radix Sort

本文详细介绍了基数排序的工作原理及其实现过程,并通过具体的代码示例展示了如何利用计数排序的思想来实现基数排序。

其实 ,只要理解了计数排序 ,对于基数排序也就驾轻就熟,因为基数排序就是运用计数排序的思想从待排元素的最低位开始不断调整,直到调整完最高位的数值

这里写图片描述

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int GetDigit(int n,int p)//取出整数n中第p位的数
{
    int i = 0;
    int t = 1;
    for(i=0; i<p; i++)
        t *= 10;
    return (n/t)%10;
}

//num为位数的个数,k为所有位上的数的最大数加1
int rxsort(int *arr,int sz,int num,int k)
{
    int *tmp = NULL;
    int *count = NULL;
    int i,j,n;

    if(!(tmp=(int*)malloc(sz*sizeof(int)))) return 0;   
    if(!(count = (int*)malloc(k*sizeof(int)))) return 0;

    for(j=0; j<num; j++)
    {
        for(i=0; i<k; i++)
            count[i] = 0;

        for(i=0; i<sz; i++)
        {
            n = GetDigit(arr[i],j);
            count[n] = count[n] + 1;
        }

        for(i=1; i<k; i++)
        {
            count[i] = count[i]+count[i-1];
        }

        for(i=sz-1; i>=0; i--)
        {
            n = GetDigit(arr[i],j);
            tmp[count[n] - 1] = arr[i];
            count[n] = count[n]-1;
        }   
    }

    memcpy(arr,tmp,sz*sizeof(int));

    free(tmp);
    free(count);
    return 1;
}

int main()
{
    int i;
    int arr[] = {324,16,728,162,666,233,250};
    int sz = sizeof(arr)/sizeof(arr[0]);

    for(i=0; i<sz; i++)
        printf("%d ",arr[i]);

    rxsort(arr,sz,3,9);

    printf("\n");
    for(i=0; i<sz; i++)
        printf("%d ",arr[i]);
    return 0;
}

结果:
这里写图片描述

基数排序的时间复杂度是取决于它使用的稳定排序算法,在这里使用的是计数排序,所以这里它的时间复杂度是计数排序的n倍,其中n是位数的个数。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值