In [3]:
def merge(l1,l2):
    l=[]
    for i in range(len(l1)+len(l2)):
        if len(l1)==0:
            l.append( l2.pop(0))
        elif len(l2)==0:
            l.append( l1.pop(0))
        elif l1[0]<l2[0]:
            l.append( l1.pop(0))
        else:
            l.append( l2.pop(0))
    return l



def merge_sort(l):
    if len(l)==0 or len(l)==1:
        return l
    m=len(l)//2 
    sorted1=merge_sort(l[slice(m)])
    sorted2=merge_sort(l[slice(m,None)])
    return merge(sorted1,sorted2)


print(merge([3],[1]))
print( merge_sort([3,5,2,1,7]))


[1, 3]
[1, 2, 3, 5, 7]

In [52]:
import random
def quick_sort(l):
    # base case
    if len(l)==0 or len(l)==1:
        return l
    elif len(l)==2:
        if l[0]<l[1]:
            return l
        else:
            return [l[1],l[0]]
    
    
    # pick a random pivot element
    p = l[random.randrange(len(l))]
    print(p)
    # make a list of elements smaller than pivot and sort it 
    sorted1=quick_sort([e for e in l if e<p])
    # make a list of elements bigger than pivot and sort it 
    sorted2=quick_sort([e for e in l if e>p])
    return sorted1+[p]+sorted2

print( quick_sort([3,5,2,1,7]))


3
[1, 2, 3, 5, 7]

In [ ]: