from numpy import *
def mergeSort(lyst):
copyBuffer = arange(len(lyst))
mergeSortHelp(lyst,copyBuffer,0,len(lyst)-1)
def mergeSortHelp(lyst,copyBuffer,low,high):
if low<high:
middle = (low+high)//2
mergeSortHelp(lyst,copyBuffer,low,middle)
mergeSortHelp(lyst,copyBuffer,middle+1,high)
merge(lyst,copyBuffer,low,middle,high)
def merge(lyst,copyBuffer,low,middle,high):
i1 = low
i2 = middle+1
for i in range(low,high+1):
if i1>middle:
copyBuffer[i]=lyst[i2]
i2 += 1
elif i2>high:
copyBuffer[i]=lyst[i1]
i1 += 1
elif lyst[i1]<lyst[i2]:
copyBuffer[i]=lyst[i1]
i1 += 1
else:
copyBuffer[i]=lyst[i2]
i2 += 1
for i in range(low,high+1):
lyst[i]=copyBuffer[i]
import random
def main(size = 20,sort = mergeSort):
lyst=[]
for count in range(20):
lyst.append(random.randint(1,size+1))
print(lyst)
sort(lyst)
print(lyst)
if __name__=="__main__":
main()
算法思想:上述算法利用率递归和分而治之的策略,突破了O(n*n)的障碍。
1、申请了一个缓存空间copyBuffer,减少了内存的分配和释放操作
2、计算一个列表的中间位置,将列表划分为2个部分,采用递归的算法重复操作该步骤,直到列表不能划分为止
3、从最小划分区域开始,调用merge函数,对数据进行排序,选择相对较小的元素放到缓存空间,并移动指针到下一个位置,直达某一个指针到达序列尾(即i1>middle,或i2>high),将剩下的数据直接赋值给缓存空间中,然后将缓存空间数组赋值给lyst。
4、重复步骤3,由底层向外层进行排序,直到递归结束。
复杂度分析:最好、最坏、平均复杂度均为O(nlogn)。
参考书籍:数据结构(python语言描述)