首页 > 编程语言 > 详细

归并排序

时间:2020-04-15 13:25:40      阅读:67      评论:0      收藏:0      [点我收藏+]

归并排序

归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。

将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。

技术分享图片

 技术分享图片

代码实现:

def merge_sort(alist):
    
    n = len(alist)

    if n <= 1:
        return alist
    
    mid = n//2

    left_li = merge_sort(alist[:mid])   #采用归并排序后形成的新的列表(左边的)
    right_li = merge_sort(alist[mid:])  #采用归并排序后形成的新的列表(右边的)
    
    #将两个有序的子序列合并成一个新的有序整体
    left_pointer,right_pointer = 0,0   #左边和右边序列的游标
    result = []
    while left_pointer < len(left_li) and right_pointer < len(right_li):
        if left_li[left_pointer] <= right_li[right_pointer]:
            result.append(left_li[left_pointer])
            left_pointer += 1
        else:
            result.append(right_li[right_pointer])
            right_pointer += 1
            
    result += left_li[left_pointer:]
    result += right_li[right_pointer:]

    return result


if __name__ == "__main__":
    li = [55,66,84,22,46,31]
    print(li)
    sorted_li = merge_sort(li)
    print(li)
    print(sorted_li)

代码分析 :

技术分享图片

 技术分享图片

技术分享图片

 技术分享图片

            技术分享图片

时间复杂度:

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(nlogn)
  • 稳定性:稳定

技术分享图片

 稳定性:(稳定)

技术分享图片

 

归并排序

原文:https://www.cnblogs.com/fenglivoong/p/12704410.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!