defpartition(arr, left, right):'''
左右遍历
返回pivot的位置索引
'''
pivot = arr[left]while left < right:while left < right and arr[right]> pivot:
right -=1
arr[left]= arr[right]while left < right and arr[left]<= pivot:
left +=1
arr[right]= arr[left]
arr[left]= pivot
return left
defpartition2(arr, left, right):'''
从开头遍历
'''
pivot = arr[left]
j = left
for i inrange(left, right):if arr[i]< pivot:
j +=1
arr[j], arr[i]= arr[i], arr[j]
arr[j], arr[left]= arr[left], arr[j]return j
应用一、快排序
defquicksort(arr, left, right):if left < right:
position = partition(arr, left, right)
quicksort(arr, left, position-1)
quicksort(arr, position+1, right)
应用二、Topk
deffindTopK(arr, k):
left, right =0,len(arr)-1
k =len(arr)- k
while left < right:
pos = partition(arr, left, right)if pos == k:return arr[k]elif pos < k:
left = pos +1else:
right = pos -1