realsdx

Ksmallest

Jul 29th, 2019
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.32 KB | None | 0 0
  1. from random import randint
  2.  
  3. def median(arr):
  4.     if len(arr) >5:
  5.         raise("Lenth should be less than 5")
  6.     arr = sorted(arr)
  7.     mid, div = divmod(len(arr), 2)
  8.     #print("MiD: ", mid)
  9.     if div == 1:
  10.         return arr[mid]
  11.     return (arr[mid-1]+arr[mid])//2
  12.  
  13.  
  14. def runner(y):
  15.     while( len(y) >5):
  16.         rm = []
  17.         for x in range(0, len(y), 5):
  18.             res = median(y[x:min(len(y), x+5)])
  19.             rm.append(res)
  20.         y = list(rm)
  21.        
  22.     return median(y)
  23.    
  24.  
  25. def findKsmallest(arr, k):
  26.     k = k-1
  27.     if(len(arr) <= 5):
  28.         return sorted(arr)
  29.        
  30.     while( len(arr) > 5):
  31.         m = runner(arr)
  32.         l_arr = []
  33.         r_arr = []
  34.    
  35.         for i in arr:
  36.             if(i < m):
  37.                 l_arr.append(i)
  38.             else:
  39.                 r_arr.append(i)
  40.  
  41.         # print(l_arr, r_arr)
  42.            
  43.         if (k< len(l_arr)):
  44.             arr = list(l_arr)
  45.         else:
  46.             arr = list(r_arr)
  47.             k = k - len(l_arr)
  48.  
  49.     return sorted(arr), k
  50.    
  51.    
  52. y = list(map(int, input("Enter y values:").split(" ")))
  53. n = int(input("Enter which smallest element:"))
  54. res, h = findKsmallest(y, n)
  55.  
  56. print("Result: ", res[h])
  57.  
  58.    
  59. def test(k, n):
  60.     arr = []
  61.     for x in range(0,k):
  62.         arr.append(randint(1, 500000))
  63.    
  64.     print("Tested using array of length %d" %len(arr))
  65.     res_arr , h= findKsmallest(arr, n)
  66.     # print("RES ARR:", res_arr)
  67.     print("%dth Smallest: "%n ,res_arr[h])
  68.  
  69. # test(2000, 3)
  70. # test(2000, 4)
  71. # test(200, 7)
  72. # test(200, 10)
  73. # test(2000, 45)
Add Comment
Please, Sign In to add comment