新手学习数据结构与算法---链表的箱子排序

 
//箱子排序---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()
{
	//自己测试 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值