快排与归并

快排

算法


输入:A[0,...,n-1]
partition(A, p, q)  //A待排序的数组,p为某次划分的起始index,q为某次划分的结束index
    i<-p
    pivot <- A[p]
    for j <-p+1 to q
        do if A[j] < pivot
        then i <- i + 1
        A[i]<-->A[j] //A[i]和A[j]交换
    A[i]<-->A[p]
    return i
 

QuickSort(A, p, q)
    if p < q
        then r <- partition(A, p, q)
        QuickSort(A, p, r -1)
        QuickSort(A, r+1, q)

 

代码


def partition(a, p, q): 
    i = p
    pivot = a[p]
    for j in range(p+1, q+1):
        if a[j]<=pivot:
            i += 1
            tmp = a[i]
            a[i] = a[j]
            a[j] = tmp
    tmp1 = a[i]
    a[i] = a[p]
    a[p] = tmp1
    return i

def quicksort(a, p, q):
    if p < q:
        r = partition(a, p, q)
        quicksort(a, p, r - 1)
        quicksort(a, r + 1, q)

 

时间复杂度

 

最优情况下,每次pivot都选择到中间大小的数。于是递归表达式有:
                             T(n)=2T(n/2) + Θ(n)
根据主方法解的T(n)=Θ(n*logn)
最差情况下,A已经处于顺序状态,此时递归表达式有:
                             T(n)=T(1) + T(n-1) + Θ(n)
通过递归树,可以得到T(n) = Θ(n*n)

 

归并

算法

 

DivideList(A, len):
    if len > 1
        then return a[0,...,len/2], a[len/2,...,len]  //可以利用floor对len/2向下取整,就可以不用分支结构判断len奇偶性else
        do return [a[0]], [a[1]]

MergeSublist(leftsublist, rightsublist)
    leftsublistloc<-0
    rightsublistloc<-0
    sortedmergelist<-[]
    for leftsublistloc<leftsublist.len and rightsublistloc<rightsublist.len
        do if leftsublist[leftsublistloc] < rightsublist[rightsublistloc]
            then sortedmergelist.append(leftsublist[leftsublistloc] )
            leftsublistloc += 1
        else
            then  sortedmergelist.append(rightsublist[rightsublistloc])
            rightsublistloc += 1
    if leftsublistloc < leftsublist.len
        then sortedmergelist.extend(leftsublist[leftsublistloc,...,leftsublist.len])
    if rightsublistloc < rightsublist.len
        then sortedmergelist.extend(rightsublist[rightsublistloc,...,rightsublist.len])
    return sortedmergelist

MergeSort(A, len) //A 待排序的序列,len为该序列长读
    if len==1
        then return A
    else
        leftsublist, rightsublist = dividelist(A, A.len)
        return mergesublist(mergesort(leftsublist, leftsublist.len), mergesort(rightsublist, rightsublist.len))

 

代码

 

def dividelist(a, q):
    if q > 1:
        return a[0:math.floor(q/2)], a[math.floor(q/2):]
    else:
        return [a[0]], [a[q]]

def mergesublist(leftsublist, rightsublist):
    sortedmergelist = []
    leftsublistloc = 0
    rightsublistloc = 0
    while(leftsublistloc<len(leftsublist) and rightsublistloc<len(rightsublist)):
        if leftsublist[leftsublistloc] <= rightsublist[rightsublistloc]:
            sortedmergelist.append(leftsublist[leftsublistloc])
            leftsublistloc += 1
        else:
            sortedmergelist.append(rightsublist[rightsublistloc])
            rightsublistloc += 1
    if(leftsublistloc < len(leftsublist)):
        sortedmergelist.extend(leftsublist[leftsublistloc:])
    if(rightsublistloc < len(rightsublist)):
        sortedmergelist.extend(rightsublist[rightsublistloc:])

    return sortedmergelist

def mergesort(a, q):
    if q == 1:
        return a
    else:
        leftsublist, rightsublist = dividelist(a, q)
        return mergesublist(mergesort(leftsublist, len(leftsublist)), mergesort(rightsublist, len(rightsublist)))

 

时间复杂度

 

该算法的递归表达式有:
            T(n) = 2T(n/2) +  Θ(n)
根据主方法,T(n) = Θ(n*logn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值