递归版本
def quick_sort(li, start, end):
if start >= end:
return
left = start
right = end
mid = li[left]
while left < right:
while left < right and li[right] >= mid:
right -= 1
li[left] = li[right]
while left < right and li[left] < mid:
left += 1
li[right] = li[left]
li[left] = mid
quick_sort(li, start, left-1)
quick_sort(li, left+1, end)
非递归版本
非递归的版本利用了栈的思想,将需要继续排序的收尾下标存入栈中,不断的弹栈进行分区操作。
def quick_sort(arr):
#模拟栈操作实现非递归的快速排序
if len(arr) < 2:
return arr
stack = []
stack.append(len(arr)-1)
stack.append(0)
while stack:
l = stack.pop()
r = stack.pop()
index = partition(arr, l, r)
if l < index - 1:
stack.append(index - 1)
stack.append(l)
if r > index + 1:
stack.append(r)
stack.append(index + 1)
def partition(arr, start, end):
# 分区操作,返回基准线下标
pivot = arr[start]
while start < end:
while start < end and arr[end] >= pivot:
end -= 1
arr[start] = arr[end]
while start < end and arr[start] <= pivot:
start += 1
arr[end] = arr[start]
# 此时start = end
arr[start] = pivot
return start