合并排序

from numpy import *
def mergeSort(lyst):
    copyBuffer = arange(len(lyst))
    mergeSortHelp(lyst,copyBuffer,0,len(lyst)-1)
def mergeSortHelp(lyst,copyBuffer,low,high):
    if low<high:
        middle = (low+high)//2
        mergeSortHelp(lyst,copyBuffer,low,middle)
        mergeSortHelp(lyst,copyBuffer,middle+1,high)
        merge(lyst,copyBuffer,low,middle,high)
def merge(lyst,copyBuffer,low,middle,high):
    i1 = low
    i2 = middle+1
    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
    for i in range(low,high+1):
            lyst[i]=copyBuffer[i]

import random
def main(size = 20,sort = mergeSort):
    lyst=[]
    for count in range(20):
        lyst.append(random.randint(1,size+1))
    print(lyst)
    sort(lyst)
    print(lyst)
if __name__=="__main__":
    main()

 
 

算法思想:上述算法利用率递归和分而治之的策略,突破了O(n*n)的障碍。

                1、申请了一个缓存空间copyBuffer,减少了内存的分配和释放操作

                2、计算一个列表的中间位置,将列表划分为2个部分,采用递归的算法重复操作该步骤,直到列表不能划分为止

                3、从最小划分区域开始,调用merge函数,对数据进行排序,选择相对较小的元素放到缓存空间,并移动指针到下一个位置,直达某一个指针到达序列尾(即i1>middle,或i2>high),将剩下的数据直接赋值给缓存空间中,然后将缓存空间数组赋值给lyst。

               4、重复步骤3,由底层向外层进行排序,直到递归结束。

复杂度分析:最好、最坏、平均复杂度均为O(nlogn)。

参考书籍:数据结构(python语言描述)

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值