数据结构与算法分析书上的快速排序代码

该代码考虑了快速排序比较多的细节,三数中值分割法选枢纽元,在分割时遇到重复元素的处理,以及当递归中的数组长度小于10以下时采用插入排序。

cutoff=3  #对于个数小于cutoff的小数组采用插入排序
def Insertsort(a,left,right):
    for i in range(left,right+1):
        cur=a[i]
        j=i
        while j>left and cur<a[j-1]:
            a[j]=a[j-1]
            j-=1
        a[j] = cur
def Quicksort(a,left,right):
    if left+cutoff<right:
        pivot=median3(a,left,right)
        i=left
        j=right-1
        temp=0
        while i<j:
            i+=1
            while a[i]<pivot:
                i+=1
            j-=1
            while a[j]>pivot:
                j-=1
            if i<j:
                temp=a[i]
                a[i]=a[j]
                a[j]=temp
        temp=a[i]
        a[i]=a[right-1]
        a[right-1]=temp
        Quicksort(a,left,i-1)
        Quicksort(a,i+1,right)
    else:
        Insertsort(a,left,right)
def median3(a,left,right):
    center=(left+right)//2
    temp=0
    if a[center]<a[left]:
        temp=a[center]
        a[center]=a[left]
        a[left]=temp
    if a[right]<a[left]:
        temp=a[right]
        a[right]=a[left]
        a[left]=temp
    if a[right]<a[center]:
        temp=a[right]
        a[right]=a[center]
        a[center]=temp
    temp=a[center]
    a[center]=a[right-1]
    a[right-1]=temp
    return a[right-1]
a=[65,58,95,10,57,62,13,106,78,23,85]
Quicksort(a,0,len(a)-1)
print(a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值