December 28, 2015 1:32 PM
歸併排序是建立在歸併操作上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
歸併排序是利用遞歸和分而治之的技術將數據序列劃分成爲越來越小的半子表,再對半子表排序,最後再用遞歸步驟將排好序的半子表合併成爲越來越大的有序序列,歸併排序包括兩個步驟,分別爲:
- 1)劃分子表
- 2)合併半子表
歸併算法用示意圖表示如下:
#MergeSort.py
#王淵
#2015.12.23
#Email:[email protected]
from pylab import *
def MSort(dataA, dataB): #子表合併排序
newData = []
lengthA = dataA.__len__()
lengthB = dataB.__len__()
while(lengthA>0 and lengthB>0): #兩個子表均非空,依次取出第一個元素作比較
if(dataA[0]<dataB[0]): #取出較小的元素插入新表
newData.append(dataA[0])
dataA = dataA[1:lengthA]
else:
newData.append(dataB[0])
dataB = dataB[1:lengthB]
lengthA = dataA.__len__()
lengthB = dataB.__len__()
if(lengthA>0): #將剩餘非空表中元素插入新表中
newData = newData+dataA
else:
newData = newData+dataB
return newData
def MergeSort(data):
length = data.__len__()
flag = mod(length,4)
step = 2 #每次按照2的整次冪將序列兩兩合併排序
while step<length:
for i in range(length//2):
data[step*i:step*i+step] = MSort(data[step*i:step*i+step//2], data[step*i+step//2:step*i+step])
if(mod((length//step),2)==1):
data[step*(i+1):length] = MSort(data[step*(i+1):step*(i+1)+step//2], data[step*(i+1)+step//2:length])
step = step*2
data = MSort(data[0:step//2], data[step//2:length])
return data
data = [48,1,16,62,73,88,24,59,99,0,35]
print("The original data is : ", data)
data = MergeSort(data)
print("The result of sorted data is : ", data)
運行結果:
The original data is : [48 1 16 62 73 88 24 59 99 0 35]
The result of sorted data is : [ 0 1 16 24 35 48 59 62 73 88 99]