桶式排序
是一种稳定的排序方法,时间复杂度为 O(n + m)。
基本思想:
假设待排序记录的值都在 0~m-1 之间,设置m个桶,首先将值为i的记录分配在第i个桶中,然后再将各个桶中的记录依次收集起来。
代码:
struct Node
{
int key;
int next;
};
struct QueueNode
{
int front;
int rear;
};
void Distribute(Node r[],int n,QueueNode q[],int m,int first)//分配算法
{
int i, k;
i = first; //first为静态链表的头指针,从下标0开始存放待排序序列
while (r[i].next != -1) //依次分配每一个待排序记录
{
k = r[i].key;
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 BucketSort(Node r[],int n,int m)
{ //从下标0开始存放待排序记录
QueueNode q[];
int i,first;
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;
}
Distribute(r, n, q, m, first); //进行分配
Collect(r, n, q, m, first); //进行收集,first指向的静态链表有序
}