链式基数排序(C语言实现)

链式基数排序C语言实现

   思想:本质就是两步——分配、收集,收集的过程中先进先出(FIFO),因此链表即是一条队列。废话不多说,直接上代码.(ps:
   本人菜鸡一枚,第一次尝试写,经验不足,请多多见谅,如果有不足之处,欢迎指正,请轻点喷!)

//链式基数排序
#include<stdio.h>
//内存分配函数需加载的头文件
#include<stdlib.h>
//定义顺序表结构类型
typedef struct
{
    //数据域
    int *data;
    //顺序表长度
    int length;
}List;
//定义链表结点结构类型
typedef struct LNode
{
    //数据域
    int data;
    //指针域 指向下一个链表结点
     struct LNode *next;
}LNode,*LinkList;
//定义链式队列数组(利用typedef 给链式队列数组起一个别名)
typedef LinkList *Queues;
//链式队列初始化
void initL(LinkList &L)
{
    //为链表的头结点分配存储空间并将其指针域设置为NULL
    L=(LNode *)malloc(sizeof(LNode));
    L->next=NULL;
}
//链式队列入队 链式存储空间一般不存在上溢问题
void in(LinkList &L,int e)
{
    //定义工作指针遍历当前链表
    LinkList T,P;
    T=L;
    //遍历当前链表 找到链表的最后一个元素 找到最后一个元素时,T->next==NULL
    while(T->next!=NULL)
    {
      T=T->next;
    }
    //为待插入的元素定义链表结点 分配存储空间并初始化
    P=(LNode *)malloc(sizeof(LNode));
    P->data=e;
    P->next=NULL;
    T->next=P;
}
//链式队列出队
int out(LinkList &L)
{
    LinkList P,N;
    P=L->next;
    if(P!=NULL)
    {
        N=P->next;
        int e;
        e=P->data;
        L->next=N;
        free(P);
        return e;
    }
}
//分配 L:待排序的顺序表 Q:链式队列数组(共10条 编号0~9) count:第几次分配 处理个位时,count==1;处理百位时,count==2;
void allocate(List &L,Queues &Q,int count)
{
    //遍历顺序表数组 将每个元素分配到对应队列中——个人习惯数组下标从1开始
    int i,j;
    for(i=1;i<=L.length;i++)
    {
        //res处理位数后的结果,divide除数
        int res,divide;
        divide=1;
        for(j=1;j<count;j++)
        {
            divide*=10;
        }//这里有个思路:用divide=pow(10,count-1)代替,但查了一下pow返回的是浮点型,非整型,故最终还是采用此种写法;
        res=(L.data[i]/divide)%10;
        //分配
        in(Q[res],L.data[i]);
    }
}
//收集
void recycle(List &L,Queues &Q)
{
    //i jfor循环遍历索引 k 数组遍历索引 数组下标从1开始 故初始值应为1
    int i,j,k;
    k=1;
    for(i=0;i<=9;i++)
    {
        while(Q[i]->next!=NULL)
        {
            L.data[k]= out(Q[i]);
            k++;
        }
    }
}
//基数排序 count本应通过检索最大值 对最大值做处理来确定分配、收集次数,我们直接默认已确定分配、收集次数
void order(List &L,int count)
{
    //为链表数组分配存储空间并初始化每一条链表
    Queues Q;
    Q=(LinkList *)malloc(sizeof(LinkList)*10);
    int i,j;
    for(i=0;i<=9;i++)
    {
        initL(Q[i]);
    }
    for(j=1;j<=count;j++)
    {
        //分配
        allocate(L,Q,j);
        //回收
        recycle(L,Q);
    }
    //链表数组已使用完毕,为避免造成空间浪费 释放
    for(j=0;j<=9;j++)
    {
        free(Q[j]);
    }
    free(Q);
}
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值