排序算法四:归并排序基本原理以及Python实现

1. 基本原理

归并排序建立在归并操作上的一种算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是将两

个已经有序的序列合成一个有序的序列的过程。

因此,对于一个待排序的序列来说,首先要将其进行分割,得到有序的子序列,再进行归并操作,最终得到有序的序列。

归并的基本思想

假设有两个有序的序列,需要合成一个序列。其实就是不断的比较两个序列开头的元素大小就可以。

if a[0] > b[0]

将a[0]存入另一个设置好的空序列C中

else

将b[0]存入另一个设置好的空序列C中

if length(a)==0 或者length(b)==0

上述操作结束

总体的思想就是不断的比较两个序列的第一个元素并存入第三个序列中,再释放原序列中的第一个元素。

分割的基本思想

分割就是将原序列不断的进行分割,以便得到有序的子序列,进行归并操作。整理介绍二分割。就是在序列的中间进行分割。

显然,对于比较长的序列需要进行多次的分割操作,使得每个子序列的元素个数只有一个。只有这样,才能得到有序的子序列,进

行归并操作。

这样话就需要对原序列进行一个递归的分割操作。得到最终的我们需要的子序列。

一个例子

这里有一个随机生成的包含了10个元素的待排序的序列

[92,79,37,39,98,62,64,33,9,5]

按照上述的基本思想,其分割和归并的流程为:
这里写图片描述

从上面可以很清楚的看到,首先需要进行分割,然后对分割的子序列进行一个归并操作,最终得到排序完成
的新序列。

2. Python实现

归并操作实现

def mergeTwoArray(a,b):
    m=a.__len__()
    n=b.__len__()
    c=[]
    while m>0 and n>0:
        if a[0]<b[0]:
            c.append(a[0])
            a.pop(0)
            m=a.__len__()
            #k+=1
        else:
            c.append(b[0])
            b.pop(0)
            n=b.__len__()
    while m>0 and n==0:
        c.append(a[0])
        a.pop(0)
        m=a.__len__()
    while n>0 and m==0:
        c.append(b[0])
        b.pop(0)
        n=b.__len__()
    return c

归并排序实现

def myMergeSort(a):
    if a.__len__()<=1:
        return a
    middleIndex=a.__len__()//2
    leftArray=myMergeSort(a[:middleIndex])#左边有序
    #print('左边序列有序的过程:')
    print(leftArray)
    #print()
    rightArray=myMergeSort(a[middleIndex:])#右边有序
    #print('右边序列有序的过程:')
    print(rightArray)
    return mergeTwoArray(leftArray,rightArray)#再合并两个有序的小数组,实现归并的思想

输出结果

这里写图片描述

3. 时间复杂度分析

并排序的效率是比较高的,设数列长为 N ,将数列分开成小数列一共要log2N步,每步都是一个合并有序数列的过程,时间复杂

度可以记为O(N),故一共为 O(Nlog2N) 。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在 O(Nlog2N)

的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值