归并排序算法的原理如下:对于给定的一组记录(假设共有n个记录),首先将每两个相邻的长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列为止。
def merge(left,right):
i,j = 0,0
result=[]
while i<len(left) and j<len(right):
if left[i]<=right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
result+=left[i:]
result+=right[j:]
return result
def merge_sort(lists):
if len(lists)<=1:
return lists
num = len(lists) // 2
left = merge_sort(lists[:num])
right = merge_sort(lists[num:])
return merge(left,right)
if __name__ =="__main__":
lists =[3,4,2,8,9,5,1,7]
print('排序前序列为:'),
for i in (lists):
print(i)
print('\n排序后结果为:'),
for i in (merge_sort(lists)):
print(i)
结果
排序前序列为:
3
4
2
8
9
5
1
7
排序后结果为:
1
2
3
4
5
7
8
9
Process finished with exit code 0
二路归并排序的过程需要进行logn次。每一趟归并排序的操作,就是将两个有序子序列进行归并,而每一对有序子序列归并时,记录的比较次数均小于等于记录的移动次数,记录移动的次数均等于文件中记录的个数n,即每一趟归并的时间复杂度为O(n)。因此二路归并排序在最好、最坏和平均情况的时间复杂度为O(nlogn),而且是一种稳定的排序方法,空间复杂度为O(1)。