模板一(不需要新建空间)
def quick_sort(res,l,r):
if l>=r:
return
left=l-1
right=r+1
mid=res[l+r>>1]
while left<right:
while True:
left+=1
if res[left]>=mid:
break
while True:
right-=1
if res[right]<=mid:
break
if left<right:
res[left],res[right]=res[right],res[left]
quick_sort(res,l,right)
quick_sort(res,right+1,r)
模板二(需要新建空间)
以数组首为标准:
def quick_sort(res):
if not res:
return []
pre=res[0]
left=quick_sort([x for x in res[1:] if x<pre])
right=quick_sort([x for x in res[1:] if x>=pre])
return left+[pre]+right
以数组中心为标准:
def quick_sort(res):
if len(res)<=1:
return res
data=res[len(res)//2]
left=quick_sort([x for x in res if x<data])
mid=[x for x in res if x ==data]
right=quick_sort([x for x in res if x>data])
return left+mid+right
例子:
第k个数:给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k个数。
def get_quickSort_k(res,l,r,k):
#递归每次都会保证第k个在区间中,当区间内只剩下一个数的时候,就是第k个。
if l==r:return res[l]
left=l-1
right=r+1
mid=res[l+r>>1]
while left<right:
while True:
left+=1
if res[left]>=mid:
break
while True:
right-=1
if res[right]<=mid:
break
if left<right:
res[left],res[right]=res[right],res[left]
#right位置为排好序的位置,如果k在其内部,递归排序[l,right]内的
if right>=k-1:
get_quickSort_k(res,l,right,k)
else:
get_quickSort_k(res,right+1,r,k)