排序算法四:归并排序基本原理以及Python实现
2017-08-21 14:44
916 查看
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(N∗log2N)
的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。
相关文章推荐
- python实现排序算法二:归并排序
- 排序算法三:堆排序基本原理以及Python实现
- 归并排序的Python实现
- 算法学习(1):排序算法-插入排序及python实现
- 排序算法(三)冒泡、选择排序的Python实现及算法优化详解 推荐
- 排序算法的C++ && Python实现---希尔排序(缩小增量排序)
- python实现字典按value排序,以及按照key排序的实现方法
- 天才排序算法:睡眠排序python使用协程实现
- 八种排序算法 Java、Python、C++实现 -- 插入排序
- 【排序算法】归并排序原理及Java实现
- 【排序算法】归并排序原理及Java实现
- python排序算法的实现-快速排序
- 35. 排序算法(8):归并排序的迭代实现
- 排序算法之直接插入排序的思想以及Java实现
- 海量数据排序,多路平衡归并算法及实现(外部文件排序算法)
- python实现排序算法一:快速排序
- 排序算法之快速排序的思想以及Java实现
- 用Python实现八大排序算法--快速排序
- 排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现
- 八大排序算法的python实现(六)归并排序