箱子排序

实现

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

基本思想

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;
}

C++箱子排序的更多相关文章

  1. 【算法】C++用链表实现一个箱子排序附源代码详解

    01 箱子排序 1.1 什么是分配排序? 分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O ...

  2. 叠罗汉III之推箱子

    有一堆箱子,每个箱子宽为wi,长为di,高为hi,现在需要将箱子都堆起来,而且为了使堆起来的箱子不到,上面的箱子的宽度和长度必须小于下面的箱子.请实现一个方法,求出能堆出的最高的高度,这里的高度即堆起 ...

  3. SGU 230. Weighings (拓扑排序)

    题意: 给出质量为1~n的n个箱子的m对轻重关系,输出一种可能的箱子的质量排列. Solution: 拓扑排序,注意要处理重边. #include <iostream> #include ...

  4. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  5. 各种排序算法及其java程序实现

    各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort)1. 基本思想 ...

  6. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  7. 牛客网NOIP赛前集训营-提高组(第八场)-B-推箱子[最短路优化建图]

    题意 有 \(n\) 个箱子,指定一个箱子开始向右推,如果碰到了别的箱子会令其移动,问 \(k\) 秒之后每个箱子所在的位置. \(n\leq 10^5\). 分析 转化成最短路模型,如果两个箱子 \ ...

  8. python——排序

    从学校毕业出来后只知道冒泡排序,发现自己对排序的了解还是很浅显. 于是在网上搜索各种排序方法,以下是本人根据索搜出来的资料再结合自己理解作出的一些简单的阐述. 如果有不正确的地方欢迎大家指正.(共同学 ...

  9. 排序算法及其java实现

    各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort) 1. 基本思 ...

随机推荐

  1. 课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 2、10个测验题

    1.What does the analogy “AI is the new electricity” refer to?  (B) A. Through the “smart grid”, AI i ...

  2. 剑指offer三十五之数组中的逆序对

    一.题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  3. Oracle 锁问题处理

    Oracle 锁问题处理 锁等待问题是一个常见的问题 查看持有锁的对象 查看事务正在执行的语句,与应用确认是否能够kill kill 对应的session

  4. Angularjs集成第三方js插件之Uploadify

    有时候需要用一些第三方插件,比如datepicker,slider,或者tree等.以前的做法是直接通过jquery取得某个元素,然后调用某个方法即可.但在angularjs中,不能直接这么写,必须写 ...

  5. DotNetOpenAuth 服务端搭建

    新建项目: 安装DotNetOpenAuth: 新增OAuthController: 代码如下: public class OAuthController : Controller { private ...

  6. C/C++ -- Gui编程 -- Qt库的使用 -- Qt5总结

    主要变化: 1.与Qt4相比,Qt5可以直接显示中文不需要手工转码2.Qt5模块发生变化,大部分组件并入widgets模块 注意事项:工程文件加一句greaterThan(QT_MAJOR_VERSI ...

  7. javascript 数组去重的6种思路

    前端在日常开发中或多或少都会碰到有对数据去重的需求,实际上,像是lodash这些工具库已经有成熟完备的实现,并且可以成熟地运用于生产环境.但是这并不妨碍我们从思维拓展的角度出发,看看去重可以用几种思路 ...

  8. warning: already initialized constant FileUtils::VERSION

    Ran into this, and the solution here works: https://stackoverflow.com/questions/51334732/rails-5-2-0 ...

  9. ThreadPool线程池的关注点

    public class TestThreadPool { //线程池维护线程的最少数量 private static final int COREPOOLSIZE = 2; //线程池维护线程的最大 ...

  10. php中时间相差8小时的解决办法

    引用:http://www.111cn.net/phper/31/42398.htm 在php中使用date('Y-m-d H:i:s');得出的结果会相差8个小时,原来是时区的问题 解决办法: 1. ...