Advertisement
maxim_shlyahtin

Lb2

Oct 20th, 2023
558
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.29 KB | None | 0 0
  1. hlyakhtin_Maksim_lb2/src/main.py
  2. @@ -0,0 +1,86 @@
  3. def calcMinRun(n):
  4.     r = 0
  5.     while n >= 64:
  6.         r |= n & 1
  7.         n >>= 1
  8.     return n + r
  9.  
  10.  
  11. def cmp(a, b):
  12.     if a ** 2 < b ** 2 or a ** 2 == b ** 2 and a > b:
  13.         return True
  14.     return False
  15.  
  16.  
  17. def insertion_sort(arr, left, right):
  18.     if len(arr) <= 1:
  19.         return
  20.  
  21.     for i in range(left + 1, right):
  22.         j = i
  23.         while j > left and cmp(arr[j], arr[j - 1]):
  24.             arr[j], arr[j - 1] = arr[j - 1], arr[j]
  25.             j -= 1
  26.  
  27.  
  28. def merge_sort(arr):
  29.     if len(arr) == 1 or len(arr) == 0:
  30.         return arr
  31.  
  32.     arr_l = merge_sort(arr[:len(arr) // 2])
  33.     arr_r = merge_sort(arr[len(arr) // 2:])
  34.     res_arr = [0] * (len(arr_l) + len(arr_r))
  35.  
  36.     arr_l_count = 0
  37.     arr_r_count = 0
  38.     res_count = 0
  39.  
  40.     while arr_r_count < len(arr_r) and arr_l_count < len(arr_l):
  41.         if arr_l[arr_l_count] ** 2 < arr_r[arr_r_count] ** 2:
  42.             res_arr[res_count] = arr_l[arr_l_count]
  43.             arr_l_count += 1
  44.         elif arr_l[arr_l_count] ** 2 > arr_r[arr_r_count] ** 2:
  45.             res_arr[res_count] = arr_r[arr_r_count]
  46.             arr_r_count += 1
  47.         elif arr_l[arr_l_count] ** 2 == arr_r[arr_r_count] ** 2:
  48.             if arr_l[arr_l_count] >= arr_r[arr_r_count]:
  49.                 res_arr[res_count] = arr_l[arr_l_count]
  50.                 arr_l_count += 1
  51.             else:
  52.                 res_arr[res_count] = arr_r[arr_r_count]
  53.                 arr_r_count += 1
  54.         res_count += 1
  55.     while arr_l_count < len(arr_l):
  56.         res_arr[res_count] = arr_l[arr_l_count]
  57.         arr_l_count += 1
  58.         res_count += 1
  59.     while arr_r_count < len(arr_r):
  60.         res_arr[res_count] = arr_r[arr_r_count]
  61.         arr_r_count += 1
  62.         res_count += 1
  63.     for i in range(len(res_arr)):
  64.         arr[i] = res_arr[i]
  65.     return arr
  66.  
  67.  
  68. def timsort(arr, minRun=32):
  69.     n = len(arr)
  70.  
  71.     i = 0
  72.     for start in range(0, n, minRun):
  73.         end = min(start + minRun, n)
  74.         insertion_sort(arr, start, end)
  75.  
  76.         if start != end:
  77.             print(f"Part {i}:", *arr[start:end])
  78.         else:
  79.             print(f"Part {i}:", arr[start])
  80.         i += 1
  81.     merge_sort(arr)
  82.  
  83.  
  84. n = int(input())
  85. arr = list(map(int, input().split()))
  86. timsort(arr)
  87. print("Answer:", *arr)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement