归并排序(Merge Sort)是一种典型的递归法排序。它把复杂的 排序过程分解成一个简单的合并子序列的过程。至于怎么得到这个子 序列,就得自己调用自己了。
归并排序首先要做的就是将数列分成左右两部分(最好是等 分),然后将左、右两个子数列排序完毕后再合并到一起就成了一个 有序数列。左、右两个子数列怎么变成有序数列呢?那就回头调用自 己,再把子数列分成左、右两部分,然后把子子数列排序完毕后合并 成子数列……有点像那个著名的故事,山上有座山,山里有座庙,庙 里有两个和尚……。和尚讲故事是无穷无尽的,幸运的是数列的长度 即使再大也不会是无尽的。所以当子子子……序列分到不可再分割的 时候(最小的序列长度为1时),就可以返回开始合并数列了。逐步合 并子子子子……数列,到最后就得到了一个新的有序数列
- import timeit
- import random
-
- def randomList(n):
- '''返回一个长度为n的整数列表,数据范围[0,1000) '''
- iList = []
- for i in range(n):
- iList.append(random.randrange(1000))
- return iList
-
- 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__":
- iList = randomList(20)
- print(iList)
- print(mergeSort(iList))
- # print(timeit.timeit("mergeSort(iList)", "from __main__ import mergeSort,iList", number=100))