哪种排序算法可以手工排序很多试卷?

时间:2011-11-05 23:01:04

标签: algorithm sorting

如果你是一群10人,必须标记400份试卷并按注册号排序,你会选择哪种排序算法?

其中哪一个最好?

  • 插入排序
  • 选择排序
  • 冒泡
  • 归并

还有更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

由于有10个标记,因此以10向并行化为目标似乎很自然。分割到第一个数字可能会以一种人类容易执行的方式实现这一点,尽管它取决于注册号码的分布,无论你是否获得均衡分区。

这也是MSD基数排序的第一步。考试论文就像链接列表一样,连接序列很便宜(把一堆放在另一堆上面)。因此,MSD基数排序为embarrassingly parallel,便于人类执行,因此我建议修改MSD基数排序:

  1. 将纸张分成10个最重要的数字[*]。为10个人中的每个人分配一堆。
  2. 每个人都会抓住他们并继续执行MSD基数排序。我希望低于一定的大小,插入排序变得比基数排序快,并且对于人类处理物理对象特别容易。如果你有测试时间,可以提前确定这个大小,或者只是留给个人猜测。对于400张纸的给定尺寸,第二步的平均尺寸为4张纸,肯定低于阈值。
  3. 最初的10个桩可能并非都是相同的尺寸,人们可能并非都以相同的速度工作。因此,10人中的一些人将先于其他人完成。幸运的是,他们很容易帮助他人:只需要找到未分类的堆并对其进行排序。
  4. 最后,将所有堆叠在一起(这是像MSD基数或快速排序这样的自上而下的方法比自下而上的方法(如LSD基数或合并输出)有很大的优势。
  5. 我不认为冒泡排序或合并排序是有用的,它们实际上是非常繁琐的手工操作。对于非常小的桩,选择排序可能值得针对插入排序进行测试。在实践中,人类可以仅通过查看数字,精神上对这些数字进行排序,然后将对象按顺序排序来对4个对象进行排序。你可以调用那种选择。

    [*]理想情况下,这是所有这些的MSD放在一起,并根据需要用前导零填充数字。但是如果您事先并不知道注册号可以有多少位数,那实际上很尴尬,可能需要初始传递所有400篇论文才能找到最大数量。另一种方法是根据注册号中的位数拆分纸张,然后从那里继续。它仍然可以作为一个自上而下的分区,只是在第一步没有方便的划分为10。

答案 1 :(得分:2)

如果我尝试对数字进行排序,那么我会多次使用名为bucket sort的算法,提取部分数字:

  • 首次运行:获取所有数字的模数10并将它们放在0到9的buckect中;

  • 第二次运行:获取模数100并除以10,然后将它们放入0到9的桶中,

一次又一次地这样做直到最后一个可能的数字。那就是:

  • 第3次:模数1000 div 100

  • 第4次:模数10000除以1000 ...

最后,您将拥有10个包含有序内容的存储桶。