def quickSort(alist):
    quickSortHelper(alist, 0,len(alist)-1)

def quickSortHelper(alist,first,last):
    if first<last:
        mid = partition(alist, first, last)
        quickSortHelper(alist, first, mid-1)
        quickSortHelper(alist, mid+1, last)

def partition(alist, first, last):
    pivotvalue = alist[first]       # would be better to be pickier
    lc = first+1
    rc = last
    while True:
        while lc <= rc and alist[lc] <= pivotvalue:
            lc += 1
        while alist[rc] >= pivotvalue and rc >= lc:
            rc -= 1
        if rc < lc:
            break                   # exit outer loop
        alist[lc], alist[rc] = alist[rc], alist[lc]
    alist[first], alist[rc] = alist[rc], alist[first]
    return rc
