ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数据结构与算法 11.归并排序 mergeSort

2021-10-30 03:00:55  阅读:198  来源: 互联网

标签:11 mergeSort 归并 nlogn 递归 复杂度 序列 数据结构


归并排序 mergeSort

把序列按长度分成两个子序列,每个子序列再次分解,重复以上操作直至无法分解(递归从外到内的过程)
把两个最小单位的子序列按条件归并成一个新序列,新序列继续和同一层的序列归并(递归从内到外的过程)
使用两个指针从被归并的两个序列中分别取值比较大小,取出满足条件的值并移动该指针,然后进行下一次比较
利用map()、reduce()进行拆解和合并的过程
需要消耗大量空间

复杂度:最优时间复杂度:O(nlogn)
        最差时间复杂度:O(nlogn)
        稳定性:稳定
def merge_sort(varlist):
    # 结束递归的条件,子序列被分解为单个元素
    if len(varlist) <= 1 :
        return varlist

    # 1.第一步:把完整的序列分解为单个元素的序列,然后作为参数调用归并两两排序

    # 将序列按长度等分
    num = len(varlist) // 2
    l_left = varlist[:num]
    l_right = varlist[num:]

    # 分解后的两个子序列调用自身继续分解,直至被分解为单个元素
    left = merge_sort(l_left)
    right = merge_sort(l_right)

    # 当出现left和right都为单个元素时,递归从外向内的过程结束,开始归并
    return merge(left,right)

def merge(left,right):
    # 2.第二步:从传入的两个序列中,按顺序各取出一个元素比较大小
    # 把满足排序条件的取出放入空list,不满足的等待下一次比较,直至任一序列中元素被取完

    # l和r指针用来标记从left和right中取值的位置
    l,r = 0,0
    # 空list用来存放排序后的结果,排序完成则return
    reslist = []

    # l增加到与left长度相等,或r增加到与right长度相等,表示该序列被遍历完成,结束循环
    while l < len(left) and r < len(right) :

        # 从两个序列中各取出一个值进行比较,把满足条件的放入新序列,并移动指针
        if left[l] < right[r] :
            reslist.append(left[l])
            l += 1
        else :
            reslist.append(right[r])
            r += 1

    # 把另一序列中剩余的元素全部添加到新序列
    # 此时另一个序列中无论剩余多少元素没被取出,都一定是在前一层归并中排好序的
    reslist += left[l:]
    reslist += right[r:]

    return reslist

varl = [5,1,7,5,6,3,4,8,2,3,5,9]
res = merge_sort(varl)
print(res)

[1, 2, 3, 3, 4, 5, 5, 5, 6, 7, 8, 9]

标签:11,mergeSort,归并,nlogn,递归,复杂度,序列,数据结构
来源: https://www.cnblogs.com/HyeJeong/p/15484191.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有