//箱子排序---Bin Sort
//算法的时间复杂度是:O(M+N)
/*
算法思想:
第一步:先创建一个单链表
第二步: 创建M 个箱子
第三步:检索单链表的每个结点,分别放到各自的箱子中
第四步:将所有的箱子连接起来
*/
/*
定义一个学生结构体,一个存代号,一个存分数,后面的分数即为箱子数组的下标;
就是将具有相同的特性的放在一起
*/
#include <stdio.h>
#include <stdlib.h>
#define M 10 //这个宏是表示链表的结点
#define N 5 // 这个宏是表示箱子的个数
typedef struct Node
{
char c; //定义一个学生的代号
int score; //定义一个学生的分数,分数的范围为(1-5)
struct Node * next;
} BSLink;
BSLink * Creat() //首先创建一个链表 , 带有头结点
{
char ch;
int i,s;
BSLink *Head, *S, *P;
Head = (BSLink *)malloc(sizeof(BSLink)); //创建头结点
Head->next = NULL;
scanf("%c %d",&ch, &s);
P = (BSLink *)malloc(sizeof(BSLink)); //创建第一个首元素结点
P->c = ch;
P->score = s;
P->next = Head->next;
Head->next = P;
for(i = 0; i < M - 1; i++) //创建剩余的M-1个结点
{
S = (BSLink *)malloc(sizeof(BSLink));
scanf("%c %d",&ch, &s);
S->c = ch;
S->score = s;
S->next = P->next;
P->next = S;
P = S;
}
return Head;
}
BSLink * bin[N];
BSLink * BinSort(BSLink * L)
{
BSLink *p, *q, *t[N];
int i;
for(i = 0; i < N; i++) //创建N个箱子
{
bin[i] = (BSLink *)malloc(sizeof(BSLink));
bin[i]->next = NULL;
}
for(i = 0; i < N; i++) //记录下各个箱子的初始位置
{
t[i] = bin[i];
}
p = L->next;
while(p != NULL) //遍历这个链表将各个结点放到各个箱子中
{
q = p;
p = p->next;
q->next = t[q->score]->next;
t[q->score]->next = q;
t[q->score] = t[q->score]->next;
}
p = bin[0];
for(i = 1; i < M; i++) //从N个箱子中收集结点,产生有序链表
{
while(p->next != NULL) //先到第一个箱子的结尾
p = p->next;
q = bin[i];
if(q->next != NULL) //考虑到是NULL
{
p->next = q->next;
p = p->next;
}
}
}
int main()
{
//自己测试
}
新手学习数据结构与算法---链表的箱子排序
最新推荐文章于 2021-11-17 03:59:35 发布