我来交作业了,今天讲归并排序。
归并排序是一种典型的递归排序。把复杂的排序过程分解成简单的合并子序列的过程。
目录
四、归并排序
原理
归并排序就是将数列分成左右两个部分,将左右两个子序列排序完毕后在合并到一起,两个子序列又要划分成更小的子序列,排完序后在合并。就一直划分,直到最小的子序列长度为1时,再一步一步合并就得到了完整的有序数列。
例题
还是以数列[7,3,5,1,4,9]为例,开始归并排序。
第一次分组
将数列[7,3,5,1,4,9]分成左右两部分,left[7,3,5],right[1,4,9]
第二轮分组
将[7,3,5]再划分,left:[7];right:[3,5]; 将[1,4,9]再划分,left:[1];right:[4,9]
第三轮分组
子序列元素个数为1时,不可划分了,停止划分;将其余不为一的子序列继续划分,直至元素个数为1为止。
全部划分阶段结束 ,我们将完整序列划分成了不可再分的子序列,这些子序列只有一个元素一定是有序的;完整划分过程如下:
下面开始合并过程
第一轮合并
第二轮合并
第三轮合并
完整合并过程:
归并排序完毕,经过三次合并,最终得到了一个有序序列,归并排序的时间复杂度是。
算法伪代码
划分过程
middle = len(iList)
left, right = iList[0:middle], iList[middle:]
合并过程
while left and right:
if left[0] >= right[0]:
mList.append(right.pop())
else:
mList.append(left.pop())
完整源码
mergeSort.py
from randomList import randomList
import timeit
iList = randomList(20)
def mergeSort(iList):
if len(iList) <= 1:
return iList
middle = len(iList)//2
left, right = iList[0:middle], iList[middle:]
return mergeList(mergeSort(left), mergeSort(right))
def mergeList(left, right):
mList = []
while left and right:
if left[0] >= right[0]:
mList.append(right.pop(0))
else:
mList.append(left.pop(0))
while left:
mList.append(left.pop(0))
while right:
mList.append(right.pop(0))
return mList
if __name__ == "__main__":
print(iList)
print(mergeSort(iList))
print(timeit.timeit("mergeSort(iList)", "from __main__ import mergeSort,iList", number=100))