部分内容转载自:http://blog.youkuaiyun.com/sunnyyoona/article/details/43795243,代码重新使用C++实现。
题目
玩过扑克牌的朋友都知道,在一局完了之后洗牌,洗牌人会习惯性的把整副牌大致分为两半,两手各拿一半对着对着交叉洗牌,我们的问题是:如何才能保证依次洗牌过后左右手牌是一一交叉的呢?
2004年,microsoft的Peiyush Jain在他发表一篇名为:“A Simple In-Place Algorithm for In-Shuffle”的论文中提出了完美洗牌算法。
什么是完美洗牌问题呢?即给定一个数组a1,a2,a3,…an,b1,b2,b3..bn,最终把它置换成b1,a1,b2,a2,…bn,an。
对原始位置的变化做如下分析:
依次考察每个位置的变化规律:
a1:1 -> 2
a2:2 -> 4
a3:3 -> 6
a4:4 -> 8
b1:5 ->

本文介绍了完美洗牌算法,从2004年Peiyush Jain的论文出发,探讨了如何在数组中实现原址洗牌,通过环操作和循环左移解决了非特定长度数组的洗牌问题,同时提供了O(n)时间和O(1)空间复杂度的解决方案。
最低0.47元/天 解锁文章
1774

被折叠的 条评论
为什么被折叠?



