首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对一副实际卡片进行排序的有效方法

对一副实际卡片进行排序的有效方法
EN

Stack Overflow用户
提问于 2010-07-24 18:27:34
回答 6查看 14K关注 0票数 22

我经常得整理一副纸牌。这些是从1到216的“收集卡”,有双倍的和缺失的数字。

我正在寻找与物理卡片很好地工作的排序算法。插入排序似乎很好,因为插入卡片不需要像在计算机存储器中那样移动后续卡片。然而,扫描一个大的卡片组是很耗时的。对于大的卡片组,甚至有可能您可能会掉下卡片组并重新开始排序。

我可以在一张大桌子上绘制卡片,并直接将每张卡片放到正确的位置,但这会占用相当多的空间,而且不是很方便。

我通常的方法是第一次扫描整个卡片组,并将它们放入堆栈1-49,50-99,100-149,150-199,200+。然后我扫描每一副牌,并将它们放在堆栈0,1,2,3,4中。最后,我对每个10包应用插入排序。不过,这仍然是一个单调乏味的过程。

另一个想法是对这50个堆栈进行粗略排序。25将位于中间,40位于堆栈末尾附近,以此类推。这很快就产生了一个大致排序的50副纸牌,我可以很容易地扫描它并修复排序。

我想知道一个更复杂的算法是否可以方便地应用到物理平台上。我不明白我们如何应用快速排序,像堆排序这样的东西需要知道卡片在卡片组中的索引。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-24 19:15:28

我认为一种快速排序是最简单的方法。我想甚至有一些Youtube视频显示,人们用普通的扑克牌来做这件事。

你看完这副牌,把所有小于100的牌放在左边的一堆,所有大的放在右边的一堆。然后递归遍历堆,深度优先(这样一次就不会有太多堆)。在某个阈值(大约5张牌)时,您只需对“在手”进行排序(可能类似于插入排序)。最后,将这些堆堆叠在一起。

你也可以做一个合并排序:将堆分成两部分,递归深度优先,直到你到达两堆,每堆5张牌。将这两堆“手中”分类,然后将它们并排放在一起。将它们合并到一个结果堆中,方法是始终将较低的显示卡放在结果堆上。你可以看到哪些堆已经被排序了,只需让它们朝上。确保总是合并相似大小的堆,否则继续拆分下一个未排序的堆。

编辑:基数排序也可以:将卡片按最后一位数分成十堆,按顺序将这些堆放在一起。然后,将卡片按倒数第二位数分成十堆,再按顺序堆叠在一起。最后,将它们按倒数第三位(根据您的描述,这是第一位)放入堆中,并将它们堆叠在一起,完成。毕竟,这可能是最简单的,而且它是O(n) (您需要三次通过卡片组)。

票数 9
EN

Stack Overflow用户

发布于 2010-07-25 00:17:48

我教过的大学课程有时偏大,我也有过对分级考试进行排序的类似任务的练习。我几乎总是使用存储桶排序,就像您一样。您还提到了合并排序方法,我有时也会这样做,但它只在您开始使用排序的子堆时才节省时间,而不是使用完全混乱的一组卡片。

有一些技巧可以加快存储桶排序的速度。人工存储桶排序中的大部分时间都花在计算下一项的存储桶上。你可以尝试两个技巧。首先,您可以按数字进行存储桶排序,我猜这称为基数排序,这样您就不必比较数字了。第一阶段使用三个存储桶,虽然不是很多,但可能还可以。第二阶段是“主要”工作,有十个桶。在第三阶段,您将对十张编号卡片进行排序,并且常识建议插入排序。但即使在这个阶段,基数排序也可以加快速度,即使每个存储桶只有一张牌。当然,你不应该使用四面的“水桶”,而是桌子上的一堆堆卡片。如果按顺序清扫卡片很容易,您将只对单位数字使用bucket方法。对于中期阶段,一个三面的插槽可能比一堆开放的纸牌工作得更好。

第二个技巧是在表0到9上标记位置,这样您就可以更快地找到正确的堆。标签可以贴在桌子上,这样你就可以重复使用它们了。

我不确定这种特定的存储桶排序策略是否是最好的策略。重点是,桶排序是对期中考试进行排序的最常用方法,也可能是最适合于大牌组的方法。有几种变体可以尝试,您应该尝试一下,看看哪一种效果最好。

票数 4
EN

Stack Overflow用户

发布于 2013-02-21 03:29:17

埃里克

不知道你是否还会遇到纸牌排序的问题,但我正在研究这个问题(卡片排序、针排序、排序机器等)。偶然发现了你的帖子。如果你没有,那么我希望其他人会发现它很有用/有帮助。

如果您能够使用打孔机并修改卡片组的边缘-那么可以使用排序技术在log2(卡片数量)操作中对整个纸堆进行排序。因此,大约200张卡需要8次运算。

我发现一种运行良好的方法如下:

1.)按你想要的方式订购纸牌,并给每张牌一个#。

2.)将此#转换为长度为log2(卡片数量)的二进制文件。例如log2(216) ~ 8,那么你只需要8个位置...所以0x0会变成00000000

3.)Enode每个卡都有它的二进制表示,如下图所示

图片

4.)像下面的卡片1一样修剪掉1(右边或LSB被修剪掉),卡片2上倒数第二个也修剪掉了…

5.)抓一个钉子,或编织针或直挂衣架等。将甲板打包在一起(无序),所有的孔都对齐

6.)将针插入整个甲板上的右手孔(或二进制lsb )。提起针头,让卡舌上没有环的卡片(你把它剪掉)掉进一个盒子里。将针钩上的卡片移到卡片组的前面。**在取出选定的卡片时,请勿更改未选定卡片的顺序...例如,将牌放在一个松散的纸盒或类似的东西中

7.)再次将甲板打包在一起,这一次使用先前使用的相邻孔上的针(右第二个)。做同样的事情,让未连接/未选中的卡片落入一个盒子中并重复。

8.)w/ 8操作整副牌都应该排序...希望这能帮助到某人

它的工作原理如下:第一个操作(步骤6)将所有奇数整数移到前面,例如,将1放在2的前面,3放在4的前面,等等。

第二个操作在3/4之前移动1/2,在7/8之前移动5/6。第三个操作在5/6/7/8之前移动1/2/3/4,在13/14/15/16之前移动9/10/11/12。第四个操作移动到9/10/11/12/13/14/15/16之前的1/2/3/4/5/6/7/8 ...最后一步是把半副牌放在另一副牌的前面。它在最少的移动中产生了一个完全有序的牌面

干杯,杰里米

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3324715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档