Sorting 考试排序的最佳算法
我是一名统计学课程的评分员,有一系列随机排列的书面作业交给我。我的部分工作是按字母顺序排列它们。我一直在使用类似于快速排序的方法,但其他评分员使用了不同的方法。我想要一个有效的排序方法,有理由,当我有“大量”的考试,有理由提供。。以下是我利用的一些细节:Sorting 考试排序的最佳算法,sorting,Sorting,我是一名统计学课程的评分员,有一系列随机排列的书面作业交给我。我的部分工作是按字母顺序排列它们。我一直在使用类似于快速排序的方法,但其他评分员使用了不同的方法。我想要一个有效的排序方法,有理由,当我有“大量”的考试,有理由提供。。以下是我利用的一些细节: 我有一份名册,上面按字母顺序列出了我应该看到的所有名字 除了第一个字母,我不想让名字按字母顺序排列。例如,如果“Smith,John”排在“Salk,Jonas”之前,我就可以了 我将永远不必对超过300个对象进行排序 到目前为止,我的方法
- 我有一份名册,上面按字母顺序列出了我应该看到的所有名字
- 除了第一个字母,我不想让名字按字母顺序排列。例如,如果“Smith,John”排在“Salk,Jonas”之前,我就可以了
- 我将永远不必对超过300个对象进行排序
有没有专门为字母排序设计的算法,或者比我的方法更有效的算法?一种似乎可行的方法是为每个字母制作一个堆栈(26堆,最坏的情况),但这会占用大量空间,因此不适合一张桌子。快速排序可能不是最好的,因为它的效率取决于轴的选择。不管怎样,只要300次考试,我就要做的是创建26堆(每个字母一个),然后只通过一次所有考试,将它们放入适当的堆中你的最后一段是插入排序。如果26根桩是两个多桩,则使用24:)。如果26堆太多,将字母表和考试分成5堆。然后对每一堆进行排序,同样,你会有5个案例(一个案例有6个)。我在浏览一些网站,这些网站都在讨论人类使用的算法,我看到有一个网站在做一种插入排序,你可以将手头的一个直接放在正确排序的地方 这样做的低效性可能是因为当堆变大时,必须扫描整个堆才能找到位置,所以我认为,为了适应这种情况,可以添加一个标记或一些东西,作为特定字母位置的索引。由于除了第一个字母外,您不关心字母顺序,因此插入成本基本上为O(1)
这只是我在考虑它时的一个想法,所以我自己并没有实际尝试过,也不能说它对足够大的桩有多有效。但我认为它应该可以很好地工作,因为标签可以让您立即访问要插入的位置。我使用bucket sort。使用四个铲斗,再次使用另一个四铲斗排序对每个铲斗进行排序,使用蛮力对每个子铲斗(1/16)进行排序
- 将第一个字母排序为
堆M
- 一旦您需要>=
堆:将所有带有不匹配起始字母的项目放在垃圾堆上M
- 第一次运行结束时:
桩完成M
- 使用垃圾堆中的剩余物进行递归
M
可以调整为与您的匹配能力相匹配,以便一眼就能匹配和放置多个字母。(和可用磁盘空间)
实际上,要获得合理的
M
值,您不需要多次运行。(齐普夫/帕累托定律)我的算法基于这样一个前提,即确定两个元素的正确顺序所需的时间并不一致。例如,我很容易说A在D之前,但我需要判断Q在T之前还是在T之前(一般来说,字母越靠近字母表的末尾,彼此之间越接近,我就越有可能必须在心里背诵字母表才能确定)
有鉴于此,我发现如果我将测试分为字母顺序的“块”,可以减少繁琐的字母背诵:
- 开始(A-F ish)
- 早中期(G-K ish)
- 中晚期(L-P-ish)
- 结束(Q-Z ish)。这一个更大,因为(a)这是我最不擅长决定字母顺序的领域,(b)这些字母中有一些不经常以姓氏开头
不过,这是我所能做到的。除了最初的分块,我永远无法真正决定什么是最有效的…这是一个很好的问题!我们做了一个小实验来接近答案 我们的设置包括
- 3台分拣机(A、B和C)
- 3堆40个学生习题集(每个分拣机一个)。一个问题集的页数从1张到5张不等。每张纸都用订书机装订好,并在第一页的顶部写上学生的名字
- 3种按字母顺序排序堆栈的排序算法:
- 插入:从未排序的堆中取出顶部项目并插入到已排序的堆中的正确位置。允许将已分类的堆成扇形
- 桶:将每个项目分为五个桶(A-E、F-J、K-O、P-T、U-Z)中的一个。然后使用插入排序对每个桶进行排序。组合已分拣的铲斗
- 合并:分割项目i