Advertisement
akariya

ECE592 Project 1 combination (1,2,3) optimized mergesort

Sep 22nd, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.25 KB | None | 0 0
  1. import numpy as np
  2.  
  3. # function to merge sorted subarrays in place
  4. def mergesort(X, p, q):
  5.  
  6.     global a
  7.     N = q - p + 1
  8.     if N < 2:
  9.         return
  10.     elif N == 2:
  11.         if X[p] > X[q]:
  12.             tmp = X[p]
  13.             X[p] = X[q]
  14.             X[q] = tmp
  15.         return
  16.     elif N == 3:
  17.         if X[p+1] > X[p+2]:
  18.             tmp = X[p+1]
  19.             X[p+1] = X[p+2]
  20.             X[p+2] = tmp
  21.         if X[p] > X[p+2]:
  22.             tmp = X[p]
  23.             X[p] = X[p+2]
  24.             X[p+2] = tmp
  25.         if X[p] > X[p+1]:
  26.             tmp = X[p]
  27.             X[p] = X[p+1]
  28.             X[p+1] = tmp
  29.         return
  30.     elif N == 4:
  31.         if X[p] > X[p+1]:
  32.             tmp = X[p]
  33.             X[p] = X[p+1]
  34.             X[p+1] = tmp
  35.         if X[p+2] > X[p+3]:
  36.             tmp = X[p+2]
  37.             X[p+2] = X[p+3]
  38.             X[p+3] = tmp
  39.         if X[p] > X[p+2]:
  40.             tmp = X[p]
  41.             X[p] = X[p+2]
  42.             X[p+2] = tmp
  43.         if X[p+1] > X[p+3]:
  44.             tmp = X[p+1]
  45.             X[p+1] = X[p+3]
  46.             X[p+3] = tmp
  47.         if X[p+1] > X[p+2]:
  48.             tmp = X[p+1]
  49.             X[p+1] = X[p+2]
  50.             X[p+2] = tmp
  51.         return
  52.    
  53.     else:
  54.         mergesort(X, p, p + int(N/2) - 1) #sort first half
  55.         mergesort(X, p + int(N/2), q) # second half
  56.         r = q
  57.         q = p + int(N/2)
  58.         N1 = q - p
  59.         N2 = r - q + 1
  60.        
  61.         N1 = q - p
  62.         N2 = r - q + 1
  63.         currN = N1 + N2
  64.         ind1 = 0
  65.         ind2 = 0
  66.         indX = p
  67.         left = [0] * N1
  68.         right = [0] * N2
  69.         left[0:N1] = X[p:p+N1]
  70.         right[0:N2] = X[q:q+N2]
  71.         if(X[q-1]<=X[q]):
  72.             return
  73.  
  74.         while ind1 < N1 and ind2 < N2:
  75.             if left[ind1] > right[ind2]:
  76.                 X[indX] = right[ind2]
  77.                 ind2 += 1
  78.             else:
  79.                 X[indX] = left[ind1]
  80.                 ind1 += 1
  81.             indX += 1
  82.      
  83.         while ind1 < N1:
  84.             X[indX] = left[ind1]
  85.             ind1 += 1
  86.             indX += 1
  87.      
  88.         while ind2 < N2:
  89.             X[indX] = right[ind2]
  90.             ind2 += 1
  91.             indX += 1
  92.  
  93.     a = X
  94.  
  95. # driver code
  96. a = np.random.randint(10000, size=10000000)
  97. mergesort(a, 0, len(a)-1)
  98. print(a)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement