链式基数排序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 LinkList *Queues;
void initL(LinkList &L)
{
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
}
void in(LinkList &L,int e)
{
LinkList T,P;
T=L;
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;
}
}
void allocate(List &L,Queues &Q,int count)
{
int i,j;
for(i=1;i<=L.length;i++)
{
int res,divide;
divide=1;
for(j=1;j<count;j++)
{
divide*=10;
}
res=(L.data[i]/divide)%10;
in(Q[res],L.data[i]);
}
}
void recycle(List &L,Queues &Q)
{
int i,j,k;
k=1;
for(i=0;i<=9;i++)
{
while(Q[i]->next!=NULL)
{
L.data[k]= out(Q[i]);
k++;
}
}
}
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);
}