用Python做归并排序

     分治法下的简单的归并排序算法复杂度O(n)=nlogn,用三个函数:

mergesort:合并排序

splitsort:单个子集排序(子集为不多于2个元素)

splitarry:递归拆分大的需排序数组,拆分为元素不多于2个子集合,然后调用splitsort和mergesort做归并排序。

这里的数组全部都用List类型

# -*- coding: utf-8 -*-
"""
Created on Sat Apr 06 18:42:12 2013

@author: zzcwing
"""
#简单的合并排序,假设输入一个List,将list拆分为不大于2个元素的子list,分别对各子list排序
#mergesort将已经排序的子序列合并排序,复杂度O(n)
def mergesort(s1,s2):
    sortedlist=[]
    i=0
    j=0
    s=0
    M=True
    while M:
        if i==len(s1) and j<len(s2):
            s=j
            while s<len(s2):
                sortedlist.append(s2[s])
                s=s+1
            M=False
        elif i<len(s1) and j==len(s2):
            s=i
            while s<len(s1):
                sortedlist.append(s1[s])
                s=s+1
            M=False
        elif i==len(s1) and j==len(s2):
            M=False
        else:
            if s1[i]<=s2[j]:
                sortedlist.append(s1[i])
                i=i+1
            else:
                sortedlist.append(s2[j])
                j=j+1
    return sortedlist
    
#子list排序,O(1)
def splitsort(scell):
    ts=0
    if len(scell)==2:
        if scell[0]>scell[1]:
            ts=scell[0]
            scell[0]=scell[1]
            scell[1]=ts
    return scell
#递归拆分,将要排序的List递归拆分为只有小于等于2个元素的list,然后依次从底层逐级合并排序,复杂度O(n)=nlogn
def splitarry(wary):
    lens=len(wary)
    if lens>=3:
        if lens%2==0:
            mid=(0+lens)/2-1
        else:
            mid=(0+lens-1)/2
        s1=wary[0:mid+1]
        
        s2=wary[mid+1:lens]
        return mergesort(splitarry(s1),splitarry(s2))
    else:
        return splitsort(wary)
#测试
print splitarry([2,7,3,5,1,9,6,16,15,14,4,8,10,11,13,12])

结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值