python算法与数据结构012--归并排序

归并排序:是采用分治法的典型应用,基本思想是将序列分解成最小,再排序并且合并,依次递归。

最优时间复杂度:O(nlogn)

最坏时间复杂度:O(nlogn)

是稳定排序

def mergeSort(dataList):
    #递归出口
    if len(dataList)<=1:
        return dataList

    #先分解
    length = len(dataList)
    left = mergeSort(dataList[:length//2])
    right= mergeSort(dataList[length//2:])
    #合并
    return mergeTwoList(left,right)

def mergeTwoList(list1,list2):
    #合并两个有序的list,假设list都是从小到大排序的。
    len1 = len(list1)
    len2 = len(list2)
    list1cusor=0
    list2cusor=0
    newList=[]
    #两个序列都从左往右取,取较小的数据存入新的序列,完成这两个序列的合并
    while list1cusor<len1 and list2cusor<len2:
        if(list1[list1cusor] < list2[list2cusor]):
            newList.append(list1[list1cusor])
            list1cusor+=1
        else:
            newList.append(list2[list2cusor])
            list2cusor+=1
    #当一个序列的数据已经全部遍历,还有数据的序列直接依次存入新的序列即可。
    while list1cusor < len1:
        newList.append(list1[list1cusor])
        list1cusor+=1
    while list2cusor<len2:
        newList.append(list2[list2cusor])
        list2cusor+=1
    return newList

data = [12,32,2,34,55,32,43,54,32,43]
newData =mergeSort(data)
print(newData)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值