runnig

Count Inversions with MergeSort

Aug 19th, 2013
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.23 KB | None | 0 0
  1. import sys
  2.  
  3. def mergecount(b,c):
  4.     N = len(b) + len(c)
  5.     ret = [0]*N
  6.  
  7.     bi = 0
  8.     cj = 0
  9.     num_inv = 0
  10.     for k in range(0,N):
  11.         if bi == len(b):            
  12.             assert cj < len(c)
  13.             ret[k] = c[cj]
  14.             cj+=1          
  15.            
  16.         elif cj == len(c):
  17.             assert bi < len(b)
  18.             ret[k] = b[bi]
  19.             bi += 1
  20.            
  21.         elif b[bi] < c[cj]:
  22.             ret[k] = b[bi]            
  23.             bi +=1            
  24.            
  25.         else:
  26.             ret[k] = c[cj]            
  27.             cj+=1
  28.             num_inv += len(b)- bi
  29.            
  30.     b = c = None
  31.     #print 'num_inv:', num_inv, ret
  32.     return num_inv, ret
  33.  
  34. def sortcount(arr):
  35.    
  36.     N = len(arr)
  37.     #print N, arr
  38.    
  39.     if N==1:
  40.         return 0, arr
  41.     else:
  42.         na, a = sortcount(arr[:N/2])
  43.         nb, b = sortcount(arr[N/2:])
  44.         nc, c = mergecount(a,b)
  45.         return na+nb+nc, c
  46.  
  47.  
  48. def main(argv):
  49.     fp = open(argv[1],'rt')
  50.     arr = []
  51.     for L in fp:
  52.         arr.append(int(L))    
  53.  
  54.     begin = 0
  55.     end = 10 # len(arr)
  56.     num_inv, arr = sortcount(arr)
  57.     print num_inv, len(arr)
  58.    
  59. if __name__ == '__main__':
  60.     main(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment