码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序之python

时间:2018-06-01 22:20:18      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:分享   递归   bsp   一个   return   class   元素   rap   图片   

归并排序( Merge sort)

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 

1.算法描述:

  • 分而治之
  • 分 :
    •   递归地拆分数组,直到它被分成两对单个元素数组为止.
    •   然后,将这些单个元素中的每一个与它的对合并,然后将这些对与它们的对等合并, 直到整个列表按照排序顺序合并为止.
  • 治 :
    •   将2个排序列表合并为另一个排序列表是很简单的.
    •   简单地通过比较每个列表的头,删除最小的,以加入新排序的列表. 
    •   O(n) 操作

技术分享图片技术分享图片

2.算法属性:

  • 稳定
  • 算法时间复杂度:O(nlogn)

技术分享图片

3.代码实现

#算法时间复杂度 O(logN)
#递归
#两个步骤:1.拆分 2.合并

def _merge(a: list, b: list) -> list:
    #合并两个排序表
    c = []
    while len(a) > 0 and len(b) > 0:
        if a[0] < b[0]:
            c.append(a[0])
            a.remove(a[0])
        else:
            c.append(b[0])
            b.remove(b[0])

    if len(a) == 0:
        c += b
    else:
        c += a
    return c


def _merge_sorted(nums: list) -> list:
    # Won‘t sort in place
    if len(nums) <= 1:
        return nums

    m = len(nums) // 2
    a = _merge_sorted(nums[:m])     #前半
    b = _merge_sorted(nums[m:])   #后半
    return _merge(a, b)


# Wrapper包装器
def merge_sorted(nums: list, reverse=False) -> list:
    import time
    start = time.time()
    #归并排序
    nums = _merge_sorted(nums)
    if reverse:
        nums = nums[::-1]

    t = time.time() - start
    return nums, len(nums), t

lis = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
merge_sorted(l, reverse=False)[0]

#输出结果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

归并排序之python

标签:分享   递归   bsp   一个   return   class   元素   rap   图片   

原文地址:https://www.cnblogs.com/kumata/p/9123492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!