snippetpythonMinor
Quicksort implementation in Python
Viewed 0 times
implementationpythonquicksort
Problem
I have written an implementation of Quicksort in Python. I am new to Python. Any suggestions for improvement or criticism on my use of Python?
def partition(a, lo, hi):
i, j, v = lo+1, hi, a[lo]
while(True):
while(a[i] v):
j -= 1
if (j == lo): break
if (i >= j): break
a[i], a[j] = a[j], a[i]
a[lo], a[j] = a[j], a[lo]
return j
def sort(a, lo, hi):
if (hi <= lo):
return
q = partition(a, lo, hi)
sort(a, lo, q-1)
sort(a, q+1, hi)
assert isSorted(a, lo, hi)
def quick_sort(a):
shuffle(a)
sort(a, 0, len(a)-1)
assert isSortedArray(a)
def isSorted(a, lo, hi):
for i in range(lo, hi):
if a[i+1] < a[i]:
return False
return True
def isSortedArray(a):
for i in range(0, len(a)-1):
if a[i+1] < a[i]:
return False
return TrueSolution
When describing quicksort partitioning, your
You always choose
I would prefer to see
… written as
Array index bounds usually work better when specified as inclusive-exclusive ranges, such that
v is typically called the "pivot". The code would be clearer if you named the variable according to that convention.You always choose
a[lo] as the pivot. However, that produces pathological performance when the input array is already sorted.I would prefer to see
while(a[i] < v):
i += 1
if (i == hi): break… written as
while i < hi and a[i] < pivot:
i += 1Array index bounds usually work better when specified as inclusive-exclusive ranges, such that
sort(a, lo, hi) means "sort a where lo ≤ index - When creating a range for the entire array
a,hiis justlen(a). You save a "-1".
- When splitting [
lo,hi) into two consecutive ranges, it becomes [lo,mid) and [mid,hi). You save a "-1".
- In Python, you can conveniently write
for i in range(lo, hi)for the most common type of iteration. (Admittedly, iterating backwards is uglier, but it's less common.)
Code Snippets
while(a[i] < v):
i += 1
if (i == hi): breakwhile i < hi and a[i] < pivot:
i += 1Context
StackExchange Code Review Q#68584, answer score: 5
Revisions (0)
No revisions yet.