Merge Sort
- divide and conquer
- recursive
- stable
- not in-place
complexity
T(n) = 2T(n/2) + c'n + c''
= 4T(n/4) + 2c'n ...
= 8T(n/8) + 3c'n ...
= ....
= 2^k * T(n/(^k)2) + 2*c'n
= 2^(logN) T(1) + log(n) c' * n
= nc + c' nlogn
time: O(nlogn)
space
- if not clear for each level
O(nlogn) - if clear after merge is done
O(2n) = O(n)
def mergeSort(A):
length = len(A)
if length < 2:
return A
mid = length / 2
left = A[:mid]
right = A[mid:]
left = self.mergeSort(left)
right = self.mergeSort(right)
return mergeI(left, right)
def merge(left, right):
# merge 2 sorted list