"""
|
|
Jeffery Russell
|
|
10-6-18
|
|
|
|
File Containing Variations of Quick Sort
|
|
"""
|
|
|
|
|
|
def partition(data):
|
|
"""
|
|
Partitions a list of data into three sections
|
|
which are lower, equal, and equal to the pivot
|
|
which is selected to be the last element in the
|
|
list.
|
|
"""
|
|
pivot = len(data) -1
|
|
lower, equal, upper = [], [], []
|
|
|
|
for i in range(0, len(data), 1):
|
|
if data[i] > data[pivot]:
|
|
upper.append(data[i])
|
|
elif data[i] == data[pivot]:
|
|
equal.append(data[i])
|
|
else:
|
|
lower.append(data[i])
|
|
|
|
return lower, equal, upper
|
|
|
|
|
|
def quickSortNormal(data):
|
|
"""
|
|
This is the traditional implementation of quick sort
|
|
where there are two recursive calls.
|
|
"""
|
|
if len(data) == 0:
|
|
return []
|
|
else:
|
|
less, equal, greater = partition(data)
|
|
return quickSortNormal(less) + equal + quickSortNormal(greater)
|
|
|
|
|
|
def quick_sort_accumulation(data, a):
|
|
"""
|
|
Implementation of quickSort which forces tail recursion
|
|
by wrapping the second recursive in the tail positioned
|
|
recursive call and added an accumulation variable.
|
|
"""
|
|
if len(data) == 0:
|
|
return a
|
|
less, equal, greater = partition(data)
|
|
return quick_sort_accumulation(less,
|
|
equal + quick_sort_accumulation(greater, a))
|
|
|
|
|
|
def quicksort(data):
|
|
"""
|
|
Wrapper function for quick sort accumulation.
|
|
"""
|
|
return quick_sort_accumulation(data, [])
|
|
|
|
|
|
|
|
print quicksort([1,3,1,5,7,9,2,3,5,5,6])
|