合并排序的算法利用了递归、分而治之的思想。
我们假设列表的长度为偶数对其过程进行分析:
1.计算一个列表的中间位置,将其分割为两个子列表
2.重复上述操作,直至子列表的长度为1
3.将长度为1的两个子列表通过比较之后进行排序,合并成一个长度为2的列表
4.将长度为2的两个子列表重复上一步操作,以此类推
合并排序的实现
我们需要定义4个函数
1.mergeSort用于用户调用
2.merge用于合并过程
3.mergeSortHelpr用于递归生成子列表
4.array用于实现一个与列表长度相同的数组,以拷贝数据
以下是具体代码
def array(lenth):
temp = list()
for i in range(lenth):
temp.append(None)
return temp
def mergeSort(lyst):
#生成一个用于储存拷贝数据的数组
copyBuffer = array(len(lyst))
#调用辅助函数
mergeSortHelper(lyst,copyBuffer,0,len(lyst)-1)
def mergeSortHelper(lyst,copyBuffer,low,high):
#low high两个参数为子列表的边界
if low < high:
middle = (low + high) // 2
#递归调用mergeSortHelper,将列表分为多个长度为1的子列表
mergeSortHelper(lyst,copyBuffer,low,middle)
mergeSortHelper(lyst,copyBuffer,middle+1,high)
#将两个列表合并
merge(lyst,copyBuffer,low,middle,high)
def merge(lyst,copyBuffer,low,middle,high):
#将两个列表第一项的指针初始化为i1 i2
i1 = low
i2 = middle+1
#从两个列表的第一项开始重复比较各项,并将较小的项从列表中复制到copyBuffer
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
#将copyBuffer中储存的数据复制到列表中
for i in range(low,high+1):
lyst[i] = copyBuffer[i]
下面进行测试
import random
list1 = []
for i in range(10):
list1.append(random.randint(0,21))
mergeSort(list1)
输入list1后,得到一个排序后的列表
>>> list1
[1, 1, 3, 4, 5, 6, 6, 7, 9, 10]
>>>