Advertisement
Deerenaros

List all permutations.

Nov 8th, 2012
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.24 KB | None | 0 0
  1. #! /usr/bin/python
  2. import sys, new
  3.  
  4. #prepare
  5. class lst(list):
  6.     def swap(self, i, j):
  7.         self[i], self[j] = self[j], self[i]
  8.     def reverseFrom(self, at):
  9.         x = at + (len(self)-at)/2
  10.         j = len(self)-1
  11.         for i in xrange(at, x):
  12.             self.swap(i, j)
  13.             j -= 1
  14.        
  15.  
  16. arr, n = lst(), int(sys.argv[1])
  17. for i in xrange(n):
  18.     arr.append(i+1)
  19.  
  20. #permutation
  21. def nextPerm(seq):
  22.     i = len(seq) - 2
  23.     while seq[i] > seq[i+1]:    #search 'jump' when next element is lesser
  24.         i -= 1          #(searching from end, but it isn't matter)
  25.         if i < 0:
  26.             break       #no jump - permutation lexicographic maximal
  27.     if i >= 0:
  28.         j = len(seq) - 1
  29.         while seq[i] > seq[j]#search larger element then el. on our 'jump'
  30.             j -= 1
  31.         seq.swap(i, j)      #swap them
  32.         seq.reverseFrom(i+1)    #reverse 'tail' - all elements after earlier 'jump'
  33.         return True #return true if exist next lexicographic permutation
  34.     seq.reverseFrom(0)      #reverse all sequence becouse it's maximal
  35.     return False #return false if next permutation is lexicographic minimal
  36.  
  37. #print all permutations
  38. do, i = True, 0
  39. while do:
  40.     sys.stdout.write(str(i) + ')\t' + str(arr) + '\n') #just print
  41.     i += 1
  42.     do = nextPerm(arr)  #compute next permutation of sequence and get
  43.                 #boolean - is one the largest?
  44. print 'last:\t', arr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement