• 毛老师算法分析课作业合并排序法


    实现合并排序:

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

    这里显示了归并排序的第一步,将数组按照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



  • 相关阅读:
    VS2019 离线安装方法详解
    VS2019 实用操作
    WIN7 X64位系统安装SQL SERVER2008失败总结
    给reportview传参数的操作过程
    山寨dell mini 3i的问题
    sql backup
    基于wince.net的环境,使用pocketBuilder调用webservice所需安装环境和步骤
    写了一个通用的用户选择页面,记录一下调用方法
    回顾这几年开发医药CRM的历程
    Cumulative Update package 3 for SQL Server 2008 R2三个补丁下载地址,官网下载不直接给地址,不知为什么
  • 原文地址:https://www.cnblogs.com/cn-gzb/p/9668330.html
Copyright © 2020-2023  润新知