Skip to content

Instantly share code, notes, and snippets.

@pdu
Created December 23, 2012 14:37
Show Gist options
  • Save pdu/4363721 to your computer and use it in GitHub Desktop.
Save pdu/4363721 to your computer and use it in GitHub Desktop.
find perfect shuffle of an array, for example: 1 2 3 4 5 6 7 8 9 10 --> 1 6 2 7 3 8 4 9 5 10
#!/usr/bin/python
def perfect_shuffle_(buf, left, right):
len_ = right - left + 1
if len_ == 2:
return
left_beg = left + len_ / 4
right_beg = left + len_ / 2
shuffle_len = len_ / 4
if len_ % 4 == 0:
for _ in xrange(0, shuffle_len):
buf[left_beg], buf[right_beg] = buf[right_beg], buf[left_beg]
left_beg += 1
right_beg += 1
else:
tmp = buf[right_beg - 1]
for _ in xrange(0, shuffle_len):
buf[left_beg], buf[right_beg - 1] = buf[right_beg], buf[left_beg]
left_beg += 1
right_beg += 1
buf[right_beg - 1] = tmp
perfect_shuffle_(buf, left, left_beg - 1)
perfect_shuffle_(buf, left_beg, right)
def perfect_shuffle(buf):
if len(buf) % 2 != 0:
return
perfect_shuffle_(buf, 0, len(buf) - 1)
def main():
buf = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
perfect_shuffle(buf)
print buf
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment