基数排序
是一种稳定的排序方法,时间复杂度为 O(n + m)。
基本思想:
将关键码看成由若干个子关键码复合而成,然后借助分配和收集操作采用LSD方法进行排序。
代码:
struct Node //定义静态链表存储待排序记录序列
{
int key[d]; //记录的键值,包括d个子关键码
int next; //游标,下一个键值在数组中的下标
};
struct QueueNode
{
int front;
int rear;
};
void Distribute (Node r[],int n,QueueNode q[],int m,int first,int j)
{ //first为静态链表的头指针,从下标0开始存放待排序序列
int k;
int i = first;
while (r[i].next != -1)
{
k = r[i].key[j]; //取出记录i的第j个子关键码的值
if (q[k].front == -1)
{
q[k].front = i; //处理队列为空的情况
}
else
{
r[q[k].rear].next = i; //在静态链表中实现插在队列尾部
}
q[k].rear = i; //修改队尾指针
i = r[i].next; //i后移,处理下一个记录
}
}
void Collect(Node r[],int n,QueueNode q[],int m,int first)// 收集算法
{ //first为静态链表的头指针,从下标0开始存放待排序序列
int last;
int k = 0;
while (q[k].front != -1)//找到第一个非空队列
{
k++;
}
first = q[k].front; //first为第一个记录
last = q[k].rear; //last为队列 K 的最后一个记录
while (k < m) //处理每一个静态链队列
{
k++;
if (q[k].front != -1) //第 K 个队列非空
{
r[last].next = q[k].front; //将队列 K 的队头和前一个队列的队尾相接
last = q[k].rear; //last 为当前收集后的最后一个记录
}
}
r[last].next = -1; //在静态链表中置尾标志
}
void RadixSort(Node r[],int n,int m,int d)
{ //从下标0开始存放待排序记录,d为记录中含有子关键码的个数
int i,j,first;
QueueNode q[];
for (i = 0; i < n;i++) //初始化静态链表
{
r[i].next = i + 1;
}
r[n - 1].next = -1;
first = 0; //设置尾标志和头指针
for (i = 0; i < m;i++) //初始化m个静态队列的队头、队尾指针
{
q[i].front = q[i].rear = -1;
}
for (j = 0; j < d;j++)
{
Distribute(r, n, q, m, first, j); //进行第j趟分配
Collect(r, n, q, m, first); //进行第j趟收集,first为头指针
}
}