排序算法

Lintcode代码练习

MegeSort

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

def sortIntegers(lst):
    if not lst:
    temp=[0]*len(lst)
    mergeSort(lst,0,len(lst),temp) 
    # temp为在归并的过程中需要的额外空间
    return lst

def mergeSort(lst,start,end,temp):
    if end-start<2: #单变量自然有序
        return
    mid=start+(start-end)//2 #以中点为界
    mergeSort(lst,start,end,temp) #对前半段排序
    mergeSort(lst,start,end,temp) #对后半段排序
    merge(lst,start,end,temp) #二路归并

def merge(lst,start,end,temp):
    #归并算法
    leftindex=start
    midindex=(start+end)//2
    rightindex=midindex
    tempindex=leftindex

    while leftindex<midindex and rightindex<end:
        if lst[leftindex]<=lst[rightindex]:
            temp[tempindex]=lst[leftindex]
            leftindex=leftindex+1
        else:
            temp[tempindex]=lst[rightindex]
            rightindex=rightindex+1
        tempindex=tempindex+1

    while leftindex<midindex: #如果left里还有数
        temp[tempindex]=lst[leftindex]
        tempindex=tempindex+1
        leftindex=leftindex+1

    while rightindex<end: #如果right里还有数
        temp[tempindex]=lst[rightindex]
        tempindex=tempindex+1
        rightindex=rightindex+1

    lst[start:end]=temp[start:end]

算法时间复杂度为 O(nlogn) O ( n l o g n )

T(n)=2T(n/2)+O(n) T ( n ) = 2 T ( n / 2 ) + O ( n )

QuickSort

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

def sortIntegers(lst):
    if not lst:
        return lst
    quickSort(lst,0,len(lst)-1)
    return lst

def quickSort(lst,start,end):
    if start>=end:
        return
    pivot=lst[(start+end)//2]
    left=start
    right=end
    while left<=right: #<=不是<
        while left<=right and lst[left]<pivot:
            left=left+1
        while left<=right and lst[right]>pivot:
            right=right-1
        if left<=right:
            temp=lst[left]
            lst[left]=lst[right]
            lst[right]=temp
            left=left+1
            right=right-1
    quickSort(lst,start,right)
    quickSort(lst,left,end)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值