排序算法四:归并排序基本原理以及Python实现
1. 基本原理
歸并排序建立在歸并操作上的一種算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。歸并排序是將兩
個(gè)已經(jīng)有序的序列合成一個(gè)有序的序列的過程。
因此,對(duì)于一個(gè)待排序的序列來(lái)說,首先要將其進(jìn)行分割,得到有序的子序列,再進(jìn)行歸并操作,最終得到有序的序列。
歸并的基本思想
假設(shè)有兩個(gè)有序的序列,需要合成一個(gè)序列。其實(shí)就是不斷的比較兩個(gè)序列開頭的元素大小就可以。
if a[0] > b[0]
將a[0]存入另一個(gè)設(shè)置好的空序列C中else
將b[0]存入另一個(gè)設(shè)置好的空序列C中if length(a)==0 或者length(b)==0
上述操作結(jié)束總體的思想就是不斷的比較兩個(gè)序列的第一個(gè)元素并存入第三個(gè)序列中,再釋放原序列中的第一個(gè)元素。
分割的基本思想
分割就是將原序列不斷的進(jìn)行分割,以便得到有序的子序列,進(jìn)行歸并操作。整理介紹二分割。就是在序列的中間進(jìn)行分割。
顯然,對(duì)于比較長(zhǎng)的序列需要進(jìn)行多次的分割操作,使得每個(gè)子序列的元素個(gè)數(shù)只有一個(gè)。只有這樣,才能得到有序的子序列,進(jìn)
行歸并操作。
這樣話就需要對(duì)原序列進(jìn)行一個(gè)遞歸的分割操作。得到最終的我們需要的子序列。
一個(gè)例子
這里有一個(gè)隨機(jī)生成的包含了10個(gè)元素的待排序的序列
[92,79,37,39,98,62,64,33,9,5]
按照上述的基本思想,其分割和歸并的流程為:
從上面可以很清楚的看到,首先需要進(jìn)行分割,然后對(duì)分割的子序列進(jìn)行一個(gè)歸并操作,最終得到排序完成
的新序列。
2. Python實(shí)現(xiàn)
歸并操作實(shí)現(xiàn)
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+=1else: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歸并排序?qū)崿F(xiàn)
def myMergeSort(a):if a.__len__()<=1:return amiddleIndex=a.__len__()//2leftArray=myMergeSort(a[:middleIndex])#左邊有序#print('左邊序列有序的過程:')print(leftArray)#print()rightArray=myMergeSort(a[middleIndex:])#右邊有序#print('右邊序列有序的過程:')print(rightArray)return mergeTwoArray(leftArray,rightArray)#再合并兩個(gè)有序的小數(shù)組,實(shí)現(xiàn)歸并的思想輸出結(jié)果
3. 時(shí)間復(fù)雜度分析
并排序的效率是比較高的,設(shè)數(shù)列長(zhǎng)為N,將數(shù)列分開成小數(shù)列一共要log2N步,每步都是一個(gè)合并有序數(shù)列的過程,時(shí)間復(fù)雜
度可以記為O(N),故一共為O(Nlog2N)。因?yàn)闅w并排序每次都是在相鄰的數(shù)據(jù)中進(jìn)行操作,所以歸并排序在O(N?log2N)
的幾種排序方法(快速排序,歸并排序,希爾排序,堆排序)也是效率比較高的。
總結(jié)
以上是生活随笔為你收集整理的排序算法四:归并排序基本原理以及Python实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为防ddos攻击(华为ddos攻击趋势
- 下一篇: Python 3实现k-邻近算法以及 i