用python进行归并排序,用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

s=j

while s

sortedlist.append(s2[s])

s=s+1

M=False

elif i

s=i

while s

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

结果如下:

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值