箱子排序

实现

把每个箱子用一个链表实现。在进行节点分配之前,每个箱子都是空的。

基本思想

1.从与排序链表的头部开始,逐个删除节点,并把它放到合适的箱子链表的头部
2.收集并连接每个箱子中的节点,产生有序的链表

两种实现

第一种实现:

只使用一个箱子数组

//range 是分数的范围
void BinSort(Chain<Node>& X,int range)
{//按分数排序
int len = X.Length();
Node x;
Chain<Node> *bin;//bin是所有的箱子
bin = new Chain<Node> [range + 1];
//分配到每个箱子中
for (int i = 1;i<=len;i++)
{
X.Delete(1,x);
bin[x.score].Insert(0,x);
}
//从箱子中收集各元素(从后向前收集)
for (int j = range;j >= 0;j--)
{
while (!bin[j].Empty())
{
bin[j].Delete(1,x);
X.Insert(0,x);
}
}
delete [] bin;
}

第二种实现

直接写成Chain的成员函数,使用两个箱子数组,一个指向头,一个指向尾。

template <class T>
void Chain<T>::BinSort(int range)
{//按分数排序
int b;//箱子索引号
bottom = new ChainNode<T>* [range +1];
top = new ChainNode<T> * [range +1];
for (b=0;b<=range;b++)//初始化
{
bottom[b] = 0;
}
//把节点分配到各个箱子中
for (; first;first = first.link)//添加到箱子中
{
b = first.data;
if (bottom[b])//箱子非空
{
top[b].link = first;
top[b] = first;
}
else //箱子为空
bottom[b] = top[b] = first;
}
//收集各箱子中的元素
ChainNode<T> *y =0;//暂存箱子的顶部指针
for (b=0;b<=range;b++)
{
if (bottom[b])//箱子非空
{
if(y)//不是第一个非空的箱子
{
y.link = bottom[b];
}
else//第一个非空的箱子
first = bottomo[b];
y = top[b];
}
}
if (y) y.link = 0;
delete [] top;
delete [] bottom;
}

最新文章

  1. [总结] JDBC数据库操作
  2. 为MFC界面添加一个Log Window
  3. 【iOS】FMDB封装,查询自动mapping
  4. .NET 分页
  5. Javascript:重用之道
  6. Test SRM Level Three: LargestCircle, Brute Force
  7. 什么是node.js
  8. python制作一个简单的中奖系统
  9. DDL(数据定义语言)
  10. R语言读取JSON数据
  11. iptables实战案例详解-技术流ken
  12. JavaScript常用函数
  13. Hashmap的Hash()
  14. C# 语句中的各种单例模式代码
  15. 【Java多线程】线程状态、线程池状态
  16. 802.11 af 要点
  17. [转帖]Docker里运行Docker docker in docker(dind)
  18. ELK+Redis 解析Nginx日志
  19. python3 BeautifulSoup模块使用
  20. nordic mesh中的消息缓存实现

热门文章

  1. easyui toopTip,鼠标划过悬浮,显示一个小提示框的方法
  2. ThreadLocal的实现机制
  3. mysql 执行 sql 语句提示Parameter &#39;@XXX&#39; must be defined
  4. 2018春招-今日头条笔试题-第一题(python)
  5. ES6 箭头函数(Arrow Functions)
  6. Glide的用法
  7. curl的head小记
  8. java字符串应用之表达式解析器
  9. select样式
  10. [BZOJ 5074]小B的数字