首页 > 技术文章 > python原地快排

jiage666 2018-10-10 14:46 原文

 

#计算枢纽值,三数取中,并将其放置倒数第二位置
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)

 

推荐阅读