基本排序算法05----合并排序(merge sort)

合并排序的算法利用了递归、分而治之的思想。


我们假设列表的长度为偶数对其过程进行分析:

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]
>>> 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值