zoukankan      html  css  js  c++  java
  • 20191209-八大排序之归并排序

    1. 归并排序

    算法核心思想

    归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。具体逻辑实现如下:

    1. 将数组按照middle进行递归拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序
    2. 合并2个排序数组的操作为:

    a)     同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的坐标往后移一个

    b)     然后继续和另外一个数组的上一个位置进行比较,以此类推

    c)     到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面

    代码实现

    def Merge(arr_a,arr_b):
        """合并arr_a和arr_b2个有序数组"""
        i = j = 0
        res = []
        while i<len(arr_a) and j<len(arr_b):
            if arr_a[i] <= arr_b[j]:
                res.append(arr_a[i])
                i+=1
            else:
                res.append(arr_b[j])
                j+=1
        if i == len(arr_a):
            res.extend(arr_b[j:])
        else:
            res.extend(arr_a[i:])
        return res
    def MergeSort(arr):
        """拆分数组为有序数组"""
        mid = len(arr)//2
        if len(arr)<=1:
            return arr
        left = MergeSort(arr[:mid])
        right = MergeSort(arr[mid:])
        return Merge(left,right)
    arr = [93,28,1,1,99,98,199,0]
    print(MergeSort(arr))

    执行解析

    先将数组进行拆分为有序数组,然后再合并2个有序数组,排序过程类似于快速排序。

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

    总结

    归并排序本身是非常类似于快速排序的一种算法,可以将归并排序和快速排序放在一起记忆。

  • 相关阅读:
    Ubuntu 出现apt-get: Package has no installation candidate问题
    关于Linux下如何获取计算机的硬件信息
    分享自fissure 《Linux编程 报错 找不到 term.h和curses.h》
    亚稳态-竺清儿-ChinaUnix博客
    分享自yebai445791253 《Verilog $random用法》
    CodeForces 1288D. Minimax Problem (二分+位运算)
    CodeForces 705D. Ant Man 贪心+链表
    CodeForces 832D. Misha, Grisha and Underground LCA
    CodeForces 832C. Strange Radiation 二分
    CodeForces 1102F. Elongated Matrix 状压Dp
  • 原文地址:https://www.cnblogs.com/hyj691001/p/12013419.html
Copyright © 2011-2022 走看看