Advertisement
frederick99

Tim Sort

Sep 10th, 2019 (edited)
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 0.90 KB | None | 0 0
  1. def insertion_sort(arr, l, r):
  2.   N = len(arr)
  3.   for i in range(l, r):
  4.     j = min(range(i, r), key=arr.__getitem__)
  5.     arr[i], arr[j] = arr[j], arr[i]
  6.  
  7.  
  8. def merge(arr, brr):
  9.   res = []
  10.  
  11.   i = j = 0
  12.   while i < len(arr) and j < len(brr):
  13.     if arr[i] < brr[j]:
  14.       res.append(arr[i])
  15.       i += 1
  16.     else:
  17.       res.append(brr[j])
  18.       j += 1
  19.  
  20.   res.extend(arr[i:])
  21.   res.extend(brr[j:])
  22.  
  23.   return res
  24.  
  25.  
  26. def tim_sort(arr, r=5):
  27.   N = len(arr)
  28.  
  29.   for i in range(0, N, r):
  30.     insertion_sort(arr, i, min(i+r, N))
  31.  
  32.   while r < N:
  33.     for i in range(0, N, 2*r):
  34.       arr[i: i + 2*r] = merge(arr[i: i+r], arr[i+r: i + 2*r])
  35.     r *= 2
  36.  
  37.  
  38. if __name__ == '__main__':
  39.   import random as rand
  40.  
  41.   for _ in range(1000):
  42.     n = rand.randrange(10,100)
  43.     l = [rand.randrange(-100, 101) for _ in range(n)]
  44.     s = sorted(l)
  45.     tim_sort(l)
  46.     assert l == s
  47.   print('Passed')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement