- 时间复杂度:
- 最好:nlog n
- 最坏:n*n
- 平均:nlog n
- 空间复杂度:log n
- 稳定性:不稳定
递归实现
def quick_sort(arr, first, last):
if first >= last:
return
pivot = partition2(arr, first, last)
quick_sort(arr, first, pivot - 1)
quick_sort(arr, pivot + 1, last)
# 经典,好理解
def partition2(arr, lo, hi):
i , j, pivot = lo+1, hi, arr[lo] # left and right scan indices, partition item
while True:
# scan right, scan left, check for scan complete, and exchange
while arr[i] < pivot:
i += 1
if i == hi:
break
while arr[j] > pivot:
j -= 1
if j == hi:
break
if i >=j:
break
arr[i], arr[j] = arr[j], arr[i]
arr[lo], arr[j] = arr[j], arr[lo] # exchange, put pivot to right place
return j
3way递归实现
def quick3way(arr, lo, hi):
if hi <= lo:
return
lt, i, gt, pivot = lo, lo+1, hi, arr[lo]
while i <= gt:
if arr[i] < pivot:
arr[lt], arr[i] = arr[i], arr[lt]
lt += 1
i += 1
elif arr[i] > pivot:
arr[i],arr[gt] = arr[gt], arr[i]
gt -= 1
else:
i += 1
quick3way(arr, lo, lt -1)
quick3way(arr, lt+1, hi)
return arr
循环实现
def quick_sort_no_recursion(arr, first, last):
if first >= last:
return arr
stack = [first, last]
while stack:
first, last = stack.pop(0), stack.pop(0) # 移除列表中的第一个元素
if first >= last:
continue
i, pivot = first - 1, arr[last] # 最后一个元素为基准值
for j in range(first, last + 1):
if arr[j] <= pivot: # 从头向后找第一个大于基准的数
i += 1 # 没找到则i+1, 都是比基准小的数
arr[i], arr[j] = arr[j], arr[i] # 交换这两数, 利用了python特性,arr[-1]即是数组最后一个元素
stack.extend([first, i - 1, i + 1, last]) # 在列表后追加
return arr