Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 考试排序的最佳算法_Sorting - Fatal编程技术网

Sorting 考试排序的最佳算法

Sorting 考试排序的最佳算法,sorting,Sorting,我是一名统计学课程的评分员,有一系列随机排列的书面作业交给我。我的部分工作是按字母顺序排列它们。我一直在使用类似于快速排序的方法,但其他评分员使用了不同的方法。我想要一个有效的排序方法,有理由,当我有“大量”的考试,有理由提供。。以下是我利用的一些细节: 我有一份名册,上面按字母顺序列出了我应该看到的所有名字 除了第一个字母,我不想让名字按字母顺序排列。例如,如果“Smith,John”排在“Salk,Jonas”之前,我就可以了 我将永远不必对超过300个对象进行排序 到目前为止,我的方法

我是一名统计学课程的评分员,有一系列随机排列的书面作业交给我。我的部分工作是按字母顺序排列它们。我一直在使用类似于快速排序的方法,但其他评分员使用了不同的方法。我想要一个有效的排序方法,有理由,当我有“大量”的考试,有理由提供。。以下是我利用的一些细节:

  • 我有一份名册,上面按字母顺序列出了我应该看到的所有名字
  • 除了第一个字母,我不想让名字按字母顺序排列。例如,如果“Smith,John”排在“Salk,Jonas”之前,我就可以了
  • 我将永远不必对超过300个对象进行排序
到目前为止,我的方法是找到班级花名册中最后一个字母的中位数(即:如果有60篇论文,选择与第30个人相对应的姓氏字母),将其视为一个轴心点,将中位数以上的所有字母放在一堆中,下面的所有字母放在另一堆中。如果一个字母与中间带相同,我将它放在中间带堆中。我现在在中央分隔带桩上方/下方做同样的事情。当这些堆足够小,一堆中只有三到四个字母时,我为每个字母做一堆,然后按字母顺序将这些堆折叠成一个主堆


有没有专门为字母排序设计的算法,或者比我的方法更有效的算法?一种似乎可行的方法是为每个字母制作一个堆栈(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)这些字母中有一些不经常以姓氏开头
有重叠——也就是说,有时我会觉得Q是中后期,有时我会觉得它结束了。这有点取决于那一点上的堆有多大,以及我最后排序的字母。。。我的理论是,不在脑子里一直拼写字母表所节省的时间比以后花在排序上的额外时间要多


不过,这是我所能做到的。除了最初的分块,我永远无法真正决定什么是最有效的…

这是一个很好的问题!我们做了一个小实验来接近答案

我们的设置包括

  • 3台分拣机(A、B和C)

  • 3堆40个学生习题集(每个分拣机一个)。一个问题集的页数从1张到5张不等。每张纸都用订书机装订好,并在第一页的顶部写上学生的名字

  • 3种按字母顺序排序堆栈的排序算法:

    • 插入:从未排序的堆中取出顶部项目并插入到已排序的堆中的正确位置。允许将已分类的堆成扇形
    • :将每个项目分为五个桶(A-E、F-J、K-O、P-T、U-Z)中的一个。然后使用插入排序对每个桶进行排序。组合已分拣的铲斗
    • 合并:分割项目i