• Python实现归并排序


    首先,归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将它们按照两个有序数组的样子合并起来。这样说起来可能很难理解,所以 图就来了:
    在这里插入图片描述
    归并排序将数组以中间的值进行拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序。

    两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后将放入空数组的那个位置的指针往后移一个,然后继续和另外一个数组的上一个位置进行比较,以此类推。到最后任何一个数组先出栈完,就将另外一个数组里的所有元素追加到新数组后面。

    递归拆分的时间复杂度是logN,进行两个有序数组排序的方法复杂度是N,所以该算法的时间复杂度是N*logN,即NlogN。

    Python代码示例:

    lst = [2, 5, 7, 8, 9, 1, 3, 4, 6]
    
    
    def merge_sort(lst, low, high):
        # 不断递归调用自己,直至拆分成单个元素的时候返回这个元素,不再拆分
        if low < high:
            # 取拆分的中间位置
            mid = (low + high) // 2
            merge_sort(lst, low, mid)  #
            merge_sort(lst, mid + 1, high)  #
            merge(lst, low, mid, high)
    
    
    def merge(lst, low, mid, high):
        i, j = low, mid + 1
        ltmp = []
        
        # 这个循环的作用是:
        # 从两个有顺序的列表里,按顺序从左到右依次比较值的大小,并把较小的放入ltmp中
        # 最终,会有一个列表被取完,而另一个列表没有被取完
        while i <= mid and j <= high:
            if lst[i] <= lst[j]:
                ltmp.append(lst[i])
                i += 1
            else:
                ltmp.append(lst[j])
                j += 1
    
        # 如果左边的列表没有被取完:
        while i <= mid:
            ltmp.append(lst[i])
            i += 1
            
        # 如果右边的列表没有被取完:
        while j <= high:
            ltmp.append(lst[j])
            j += 1
           
        lst[low:high + 1] = ltmp
    
    
    merge_sort(lst, 0, len(lst) - 1)
    
    print(lst)
  • 相关阅读:
    Windows Phone App的dump 文件分析
    博客园客户端UAP开发随笔 -- App的心动杀手锏:动画
    博客园客户端UAP开发随笔--自定义控件的左膀右臂
    新年快乐
    博客园客户端(Universal App)开发随笔
    博客园 UAP 的部分反馈回复
    博客园客户端(Universal App)开发随笔 -- 样式管理与夜间模式
    Hadoop专业解决方案-第5章 开发可靠的MapReduce应用
    胖子哥的大数据之路(6)- NoSQL生态圈全景介绍
    NoSQL高级培训课程-HBase&&MongoDB(两天版)
  • 原文地址:https://www.cnblogs.com/babyjoy/p/9574035.html
Copyright © 2020-2023  润新知