zoukankan      html  css  js  c++  java
  • 毛老师算法分析课作业合并排序法

    实现合并排序:

    首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。这样说起来可能很难理解,于是给出一张我画的图。

    这里显示了归并排序的第一步,将数组按照middle进行递归拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序。

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

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

    根据这波分析,我们可以看看对上图的一个行为。

    当最左边的分到最细之后无法再划分左右然后开始进行合并。

    第一次组合完成[4, 7]的合并

    第二次组合完成[4, 7, 8]的合并

    第三次组合完成[3, 5]的合并

    第四次组合完成[3, 5, 9]的合并

    第五次组合完成[3, 4, 5, 7, 8, 9]的合并结束排序。

    # -*- coding: utf-8 -*-
    # @Time    : 18-9-18 上午10:59
    # @Author  : Guo Zhengbing
    # @Email   : cn_gzb@126.com
    
    
    #产生一个1000个元素的数组
    import random
    def random_int_list(start, stop, length):
        start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start))
        length = int(abs(length)) if length else 0
        random_list = []
        for i in range(length):
            random_list.append(random.randint(start, stop))
        return random_list
    a = random_int_list(1,1000,20)
    
    #合并排序
    def MergeSort(lists):
        if len(lists) <= 1:
            return lists
        mid = len(lists)//2
        #递归
        listA = MergeSort(lists[:mid])
        listB = MergeSort(lists[mid:])
    """
    print("========listA========") print(listA) print("========listB========") print(listB)
    """
    return MergeSortedLists(listA, listB) #合并两个有序数集 def MergeSortedLists(listA, listB): newList = list() a = 0 b = 0 # Merge the two lists together until one is empty while a < len(listA) and b < len(listB): if listA[a] < listB[b]: newList.append(listA[a]) a += 1 else: newList.append(listB[b]) b += 1 # If listA contains more items,append them to newList while a < len(listA): newList.append(listA[a]) a += 1 while b < len(listB): newList.append(listB[b]) b += 1 return newList # If listB contains more items,append them to newList if __name__ == "__main__": lists = a print(lists) result = MergeSort(lists) print("排序前:", a) print("排序后:", result)

    输出:

    [748, 256, 946, 364, 496, 807, 758, 689, 274, 767, 962, 534, 434, 481, 464, 538, 652, 547, 483, 472]
    
    排序前: [748, 256, 946, 364, 496, 807, 758, 689, 274, 767, 962, 534, 434, 481, 464, 538, 652, 547, 483, 472]
    排序后: [256, 274, 364, 434, 464, 472, 481, 483, 496, 534, 538, 547, 652, 689, 748, 758, 767, 807, 946, 962]
    
    Process finished with exit code 0



  • 相关阅读:
    Winform程序及dll打包成一个可执行的exe
    DotfuscatorPro防止反编译&ILSpy反编译
    C# 7-zip 压缩和解压缩
    ASP.NET MVC使用JWT代替session,实现单点登陆
    C#动态实体集的反序列化(动态JSON反序列化)
    FTP服务安装及使用
    未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
    项目在服务上运行出现中文水印乱码问题解决(第二篇)
    图片加水印信息处理及中文乱码解决
    MongoDB 索引
  • 原文地址:https://www.cnblogs.com/cn-gzb/p/9668330.html
Copyright © 2011-2022 走看看