I am practicing merge sort and am curious if my second version is better than the first -- it seems to be in terms of memory requirement since I am popping from a list instead of just moving indices
Version 1:
def mergesort(L):
if len(L)<=1: return L
pivot=len(L)/2
left=mergesort(L[:pivot])
right=mergesort(L[pivot:])
i=j=0
sortedArr=[]
while i<len(left) and j<len(right):
if left[i]<right[j]:
sortedArr.append(left[i])
i+=1
else:
sortedArr.append(right[j])
j+=1
return sortedArr + left[i:] + right[j:]
Version 2
def mergesort(L):
if len(L)<=1: return L
pivot=len(L)/2
left=mergesort(L[:pivot])
right=mergesort(L[pivot:])
sortedArr=[]
while left!=[] and right!=[]:
if left[0]<right[0]:
sortedArr.append(left.pop(0))
else:
sortedArr.append(right.pop(0))
return sortedArr + left + right
Without getting into parallelizing, is there any way to further improve upon Version 2, assuming it is superior to Version 1? How would I describe the memory requirements of these two versions so far?