#计算枢纽值,三数取中,并将其放置倒数第二位置
def Mid3(A,left,right):
#left,right=0,len(A)-1
center=(left+right)//2
if A[left]>A[center]:
A[left],A[center]=A[center],A[left]
if A[left]>A[right]:
A[left],A[right]=A[right],A[left]
if A[center]>A[right]:
A[center],A[right]=A[right],A[center]
#主元和right-1的位置交换(原地模式,无需新开数组)
A[center],A[right-1]=A[right-1],A[center]
return A[right-1]
#分割
def quicksort(A,left,right):
#迭代终止条件
if left<right:
pivot=Mid3(A,left,right)
#只要扫描left+1到right-2即可,Mid3已经可以保证A[lef]t<=pivot<=A[right-1]
i=left+1
j=right-2
while(1):
while(A[i]<pivot):
i=i+1
while(A[j]>pivot):
j=j-1
if i<j:
A[i],A[j]=A[j],A[i]
i=i+1
j=j-1
else:
break
#把pivot放到最终的位置上
A[i],A[right-1]=A[right-1],A[i]
quicksort(A,left,i-1)
quicksort(A,i+1,right)
#封装接口
def quick_sort(A):
left,right=0,len(A)-1
quicksort(A,left,right)
#测试
A=[9,8,7,6,5,4,3,2,1]
quick_sort(A)
print(A)