import random
def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
def partition(arr, l, r):
lst = arr[r]
i = l
j = l
while j < r:
if arr[j] < lst:
swap(arr, i, j)
i += 1
j += 1
swap(arr, i, r)
return i
def randomPartition(arr, l, r):
n = r - l + 1
pivot = random.randint(0, n - 1)
swap(arr, l + pivot, r)
return partition(arr, l, r)
def medianUtil(arr, l, r, k, a, b):
if l <= r:
partitionIndex = randomPartition(arr, l, r)
# find the median of odd number element in arr[]
if partitionIndex == k:
b[0] = arr[partitionIndex]
if a[0] != -1:
return
elif partitionIndex == k - 1: # a & b as middle element of arr[]
a[0] = arr[partitionIndex]
if b[0] != -1:
return
# index in first half of the arr[]
if partitionIndex >= k:
medianUtil(arr, l, partitionIndex - 1, k, a, b)
# find the index in second half of the arr[]
else:
medianUtil(arr, partitionIndex + 1, r, k, a, b)
def findMedian(arr):
a = [-1]
b = [-1]
n = len(arr)
if n % 2 == 1:
medianUtil(arr, 0, n - 1, n // 2, a, b)
return b[0]
else:
medianUtil(arr, 0, n - 1, n // 2, a, b)
return (a[0] + b[0]) / 2.0
if __name__ == '__main__':
arr = [12, 3, 6, 7, 4, 19]
print(findMedian(arr))